From 933ae89206722e11d2e8fea79b10a0e9689f913d Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Fri, 27 Mar 2026 10:10:13 -0600 Subject: [PATCH 01/49] begin open loop peak load management control --- ..._management_openloop_storage_controller.py | 274 ++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 h2integrate/control/control_strategies/storage/peak_load_management_openloop_storage_controller.py diff --git a/h2integrate/control/control_strategies/storage/peak_load_management_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/peak_load_management_openloop_storage_controller.py new file mode 100644 index 000000000..2d4425ef8 --- /dev/null +++ b/h2integrate/control/control_strategies/storage/peak_load_management_openloop_storage_controller.py @@ -0,0 +1,274 @@ +from copy import deepcopy + +import numpy as np +from attrs import field, define + +from h2integrate.core.utilities import merge_shared_inputs +from h2integrate.core.validators import gte_zero, range_val, range_val_or_none +from h2integrate.control.control_strategies.storage.openloop_storage_control_base import ( + StorageOpenLoopControlBase, + StorageOpenLoopControlBaseConfig, +) + + +@define(kw_only=True) +class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBaseConfig): + """ + Configuration class for the DemandOpenLoopStorageController. + + This class defines the parameters required to configure the `DemandOpenLoopStorageController`. + + Attributes: + commodity (str): Name of the commodity being controlled + (e.g., "hydrogen"). Stripped of whitespace. + commodity_rate_units (str): Units of the commodity (e.g., "kg/h"). + demand_profile (int | float | list): Demand values for each timestep, in + the same units as `commodity_rate_units`. May be a scalar for constant + demand or a list/array for time-varying demand. + max_capacity (float): Maximum storage capacity of the commodity (in non-rate units, + e.g., "kg" if `commodity_rate_units` is "kg/h"). + max_soc_fraction (float): Maximum allowable state of charge (SOC) as a fraction + of `max_capacity`, between 0 and 1. + min_soc_fraction (float): Minimum allowable SOC as a fraction of `max_capacity`, + between 0 and 1. + init_soc_fraction (float): Initial SOC as a fraction of `max_capacity`, + between 0 and 1. + max_charge_rate (float): Maximum rate at which the commodity can be charged (in units + per time step, e.g., "kg/time step"). This rate does not include the charge_efficiency. + charge_equals_discharge (bool, optional): If True, set the max_discharge_rate equal to the + max_charge_rate. If False, specify the max_discharge_rate as a value different than + the max_charge_rate. Defaults to True. + max_discharge_rate (float | None, optional): Maximum rate at which the commodity can be + discharged (in units per time step, e.g., "kg/time step"). This rate does not include + the discharge_efficiency. Only required if `charge_equals_discharge` is False. + charge_efficiency (float | None, optional): Efficiency of charging the storage, represented + as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if + `round_trip_efficiency` is provided. + discharge_efficiency (float | None, optional): Efficiency of discharging the storage, + represented as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if + `round_trip_efficiency` is provided. + round_trip_efficiency (float | None, optional): Combined efficiency of charging and + discharging the storage, represented as a decimal between 0 and 1 (e.g., 0.81 for + 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are + provided. + commodity_amount_units (str | None, optional): Units of the commodity as an amount + (i.e., kW*h or kg). If not provided, defaults to commodity_rate_units*h. + """ + + max_capacity: float = field() + max_soc_fraction: float = field(validator=range_val(0, 1)) + min_soc_fraction: float = field(validator=range_val(0, 1)) + init_soc_fraction: float = field(validator=range_val(0, 1)) + max_charge_rate: float = field(validator=gte_zero) + charge_equals_discharge: bool = field(default=True) + max_discharge_rate: float | None = field(default=None) + charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + + def __attrs_post_init__(self): + """ + Post-initialization logic to validate and calculate efficiencies. + + Ensures that either `charge_efficiency` and `discharge_efficiency` are provided, + or `round_trip_efficiency` is provided. If `round_trip_efficiency` is provided, + it calculates `charge_efficiency` and `discharge_efficiency` as the square root + of `round_trip_efficiency`. + """ + super().__attrs_post_init__() + + if (self.round_trip_efficiency is not None) and ( + self.charge_efficiency is None and self.discharge_efficiency is None + ): + # Calculate charge and discharge efficiencies from round-trip efficiency + self.charge_efficiency = np.sqrt(self.round_trip_efficiency) + self.discharge_efficiency = np.sqrt(self.round_trip_efficiency) + self.round_trip_efficiency = None + if self.charge_efficiency is None or self.discharge_efficiency is None: + raise ValueError( + "Exactly one of the following sets of parameters must be set: (a) " + "`round_trip_efficiency`, or (b) both `charge_efficiency` " + "and `discharge_efficiency`." + ) + + if self.charge_equals_discharge: + if ( + self.max_discharge_rate is not None + and self.max_discharge_rate != self.max_charge_rate + ): + msg = ( + "Max discharge rate does not equal max charge rate but charge_equals_discharge " + f"is True. Discharge rate is {self.max_discharge_rate} and charge rate " + f"is {self.max_charge_rate}." + ) + raise ValueError(msg) + + self.max_discharge_rate = self.max_charge_rate + + +class PeakLoadManagementOpenLoopStorageController(StorageOpenLoopControlBase): + """ + A controller that manages commodity flow based on demand and storage constraints. + + The `DemandOpenLoopStorageController` computes the dispatch commands for a commodity storage + system. It uses a demand profile and storage parameters to determine how much of the + commodity to charge, discharge, or curtail at each time step. + """ + + def setup(self): + self.config = PeakLoadManagementOpenLoopStorageController.from_dict( + merge_shared_inputs(self.options["tech_config"]["model_inputs"], "control"), + strict=False, + additional_cls_name=self.__class__.__name__, + ) + super().setup() + + self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] + + # Design constraints of storage system + self.add_input( + "max_charge_rate", + val=self.config.max_charge_rate, + units=self.config.commodity_rate_units, + desc="Storage charge/discharge rate", + ) + + self.add_input( + "storage_capacity", + val=self.config.max_capacity, + units=self.config.commodity_amount_units, + desc="Maximum storage capacity", + ) + + if not self.config.charge_equals_discharge: + self.add_input( + "max_discharge_rate", + val=self.config.max_discharge_rate, + units=self.config.commodity_rate_units, + desc="Storage discharge rate", + ) + + def compute(self, inputs, outputs): + """ + Compute storage state of charge (SOC), delivered output, curtailment, and unmet + demand over the simulation horizon. + + This method applies an open-loop storage control strategy to balance the + commodity demand and input flow. When input exceeds demand, excess commodity + is used to charge storage (subject to rate, efficiency, and SOC limits). When + demand exceeds input, storage is discharged to meet the deficit (also subject + to constraints). SOC is updated at each time step, ensuring it remains within + allowable bounds. + + Expected input keys: + * ``_in``: Timeseries of commodity available at each time step. + * ``_demand``: Timeseries demand profile. + * ``max_charge_rate``: Maximum charge rate permitted. + * ``max_capacity``: Maximum total storage capacity. + + Outputs populated: + * ``_set_point``: Dispatch command to storage, + negative when charging, positive when discharging. + + Control logic includes: + * Enforcing SOC limits (min, max, and initial conditions). + * Applying charge and discharge efficiencies. + * Observing charge/discharge rate limits. + * Tracking energy shortfalls and excesses at each time step. + + Raises: + UserWarning: If the demand profile is entirely zero. + UserWarning: If ``max_charge_rate`` or ``max_capacity`` is negative. + + Returns: + None + """ + commodity = self.config.commodity + if np.all(inputs[f"{commodity}_demand"] == 0.0): + msg = "Demand profile is zero, check that demand profile is input" + raise UserWarning(msg) + if inputs["max_charge_rate"][0] < 0: + msg = ( + f"max_charge_rate cannot be less than zero and has value of " + f"{inputs['max_charge_rate']}" + ) + raise UserWarning(msg) + if inputs["storage_capacity"][0] < 0: + msg = ( + f"storage_capacity cannot be less than zero and has value of " + f"{inputs['storage_capacity']}" + ) + raise UserWarning(msg) + + max_capacity = inputs["storage_capacity"].item() + max_charge_rate = inputs["max_charge_rate"].item() + + if self.config.charge_equals_discharge: + max_discharge_rate = inputs["max_charge_rate"].item() + else: + max_discharge_rate = inputs["max_discharge_rate"].item() + + soc_max = self.config.max_soc_fraction + soc_min = self.config.min_soc_fraction + init_soc_fraction = self.config.init_soc_fraction + + charge_eff = float(self.config.charge_efficiency) + discharge_eff = float(self.config.discharge_efficiency) + + # Initialize time-step state of charge prior to loop so the loop starts with + # the previous time step's value + soc = deepcopy(init_soc_fraction) + + demand_profile = inputs[f"{commodity}_demand"] + + # initialize outputs + soc_array = np.zeros(self.n_timesteps) + set_point_array = np.zeros(self.n_timesteps) + combined_output_array = np.zeros(self.n_timesteps) + # Loop through each time step + for t, demand_t in enumerate(demand_profile): + # Get the input flow at the current time step + input_flow = inputs[f"{commodity}_in"][t] + + # Calculate the available charge/discharge capacity + available_charge = float((soc_max - soc) * max_capacity) + available_discharge = float((soc - soc_min) * max_capacity) + + # Determine the output flow based on demand_t and SOC + if demand_t > input_flow: + # Discharge storage to meet demand. + # `discharge_needed` is as seen by the storage + discharge_needed = (demand_t - input_flow) / discharge_eff + # `discharge` is as seen by the storage, but `max_discharge_rate` is as observed + # outside the storage + discharge = min( + discharge_needed, available_discharge, max_discharge_rate / discharge_eff + ) + + soc -= discharge / max_capacity # soc is a ratio with value between 0 and 1 + # output is as observed outside the storage, so we need to adjust `discharge` by + # applying `discharge_efficiency`. + combined_output_array[t] = input_flow + discharge * discharge_eff + set_point_array[t] = discharge * discharge_eff + else: + # Charge storage with unused input + # `unused_input` is as seen outside the storage + unused_input = input_flow - demand_t + unused_input = unused_input.item() + # `charge` is as seen by the storage, but the things being compared should all be as + # seen outside the storage so we need to adjust `available_charge` outside the + # storage view and the final result back into the storage view. + charge = ( + min(unused_input, available_charge / charge_eff, max_charge_rate) * charge_eff + ) + soc += charge / max_capacity # soc is a ratio with value between 0 and 1 + combined_output_array[t] = demand_t + set_point_array[t] = -1 * charge / charge_eff + + # Ensure SOC stays within bounds + soc = max(soc_min, min(soc_max, soc)) + + # Record the SOC for the current time step + soc_array[t] = deepcopy(soc) + + outputs[f"{commodity}_set_point"] = set_point_array From d338cce19a7a757746938d6ff3977bfc6ca984c8 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Sat, 28 Mar 2026 17:27:21 -0600 Subject: [PATCH 02/49] peak finding working as expected --- .../storage/openloop_storage_control_base.py | 11 +- ..._management_openloop_storage_controller.py | 274 - .../storage/test/data/lmp_month_1.csv | 8893 +++++++++++++++++ .../storage/test/data/lmp_peaks_month_1.csv | 11 + ..._management_openloop_storage_controller.py | 121 + 5 files changed, 9032 insertions(+), 278 deletions(-) delete mode 100644 h2integrate/control/control_strategies/storage/peak_load_management_openloop_storage_controller.py create mode 100644 h2integrate/control/control_strategies/storage/test/data/lmp_month_1.csv create mode 100644 h2integrate/control/control_strategies/storage/test/data/lmp_peaks_month_1.csv create mode 100644 h2integrate/control/control_strategies/storage/test/test_peak_load_management_openloop_storage_controller.py diff --git a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py index 108cdabfd..744363ad8 100644 --- a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py +++ b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py @@ -12,9 +12,10 @@ class StorageOpenLoopControlBaseConfig(BaseConfig): Attributes: commodity (str): Name of the commodity being stored (e.g., "hydrogen"). commodity_rate_units (str): Rate units of the commodity (e.g., "kg/h" or "kW"). - demand_profile (int | float | list): Demand values for each timestep, in + demand_profile (int | float | list | dict): Demand values for each timestep, in the same units as `commodity_rate_units`. May be a scalar for constant - demand or a list/array for time-varying demand. + demand or a list/array/dict for time-varying demand. If a dict is provided, it + it should have two keys: "time_date" and "demand". commodity_amount_units (str | None, optional): Units of the commodity as an amount (i.e., kW*h or kg). If not provided, defaults to `commodity_rate_units*h`. @@ -22,7 +23,7 @@ class StorageOpenLoopControlBaseConfig(BaseConfig): commodity: str = field() commodity_rate_units: str = field() - demand_profile: int | float | list = field() + demand_profile: int | float | list | dict = field() commodity_amount_units: str = field(default=None) def __attrs_post_init__(self): @@ -48,9 +49,11 @@ def setup(self): commodity = self.config.commodity + demand_data = self.config.demand_profile + self.add_input( f"{commodity}_demand", - val=self.config.demand_profile, + val=demand_data if not isinstance(demand_data, dict) else demand_data["demand"], shape=self.n_timesteps, units=self.config.commodity_rate_units, desc=f"Demand profile of {commodity}", diff --git a/h2integrate/control/control_strategies/storage/peak_load_management_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/peak_load_management_openloop_storage_controller.py deleted file mode 100644 index 2d4425ef8..000000000 --- a/h2integrate/control/control_strategies/storage/peak_load_management_openloop_storage_controller.py +++ /dev/null @@ -1,274 +0,0 @@ -from copy import deepcopy - -import numpy as np -from attrs import field, define - -from h2integrate.core.utilities import merge_shared_inputs -from h2integrate.core.validators import gte_zero, range_val, range_val_or_none -from h2integrate.control.control_strategies.storage.openloop_storage_control_base import ( - StorageOpenLoopControlBase, - StorageOpenLoopControlBaseConfig, -) - - -@define(kw_only=True) -class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBaseConfig): - """ - Configuration class for the DemandOpenLoopStorageController. - - This class defines the parameters required to configure the `DemandOpenLoopStorageController`. - - Attributes: - commodity (str): Name of the commodity being controlled - (e.g., "hydrogen"). Stripped of whitespace. - commodity_rate_units (str): Units of the commodity (e.g., "kg/h"). - demand_profile (int | float | list): Demand values for each timestep, in - the same units as `commodity_rate_units`. May be a scalar for constant - demand or a list/array for time-varying demand. - max_capacity (float): Maximum storage capacity of the commodity (in non-rate units, - e.g., "kg" if `commodity_rate_units` is "kg/h"). - max_soc_fraction (float): Maximum allowable state of charge (SOC) as a fraction - of `max_capacity`, between 0 and 1. - min_soc_fraction (float): Minimum allowable SOC as a fraction of `max_capacity`, - between 0 and 1. - init_soc_fraction (float): Initial SOC as a fraction of `max_capacity`, - between 0 and 1. - max_charge_rate (float): Maximum rate at which the commodity can be charged (in units - per time step, e.g., "kg/time step"). This rate does not include the charge_efficiency. - charge_equals_discharge (bool, optional): If True, set the max_discharge_rate equal to the - max_charge_rate. If False, specify the max_discharge_rate as a value different than - the max_charge_rate. Defaults to True. - max_discharge_rate (float | None, optional): Maximum rate at which the commodity can be - discharged (in units per time step, e.g., "kg/time step"). This rate does not include - the discharge_efficiency. Only required if `charge_equals_discharge` is False. - charge_efficiency (float | None, optional): Efficiency of charging the storage, represented - as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if - `round_trip_efficiency` is provided. - discharge_efficiency (float | None, optional): Efficiency of discharging the storage, - represented as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if - `round_trip_efficiency` is provided. - round_trip_efficiency (float | None, optional): Combined efficiency of charging and - discharging the storage, represented as a decimal between 0 and 1 (e.g., 0.81 for - 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are - provided. - commodity_amount_units (str | None, optional): Units of the commodity as an amount - (i.e., kW*h or kg). If not provided, defaults to commodity_rate_units*h. - """ - - max_capacity: float = field() - max_soc_fraction: float = field(validator=range_val(0, 1)) - min_soc_fraction: float = field(validator=range_val(0, 1)) - init_soc_fraction: float = field(validator=range_val(0, 1)) - max_charge_rate: float = field(validator=gte_zero) - charge_equals_discharge: bool = field(default=True) - max_discharge_rate: float | None = field(default=None) - charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - - def __attrs_post_init__(self): - """ - Post-initialization logic to validate and calculate efficiencies. - - Ensures that either `charge_efficiency` and `discharge_efficiency` are provided, - or `round_trip_efficiency` is provided. If `round_trip_efficiency` is provided, - it calculates `charge_efficiency` and `discharge_efficiency` as the square root - of `round_trip_efficiency`. - """ - super().__attrs_post_init__() - - if (self.round_trip_efficiency is not None) and ( - self.charge_efficiency is None and self.discharge_efficiency is None - ): - # Calculate charge and discharge efficiencies from round-trip efficiency - self.charge_efficiency = np.sqrt(self.round_trip_efficiency) - self.discharge_efficiency = np.sqrt(self.round_trip_efficiency) - self.round_trip_efficiency = None - if self.charge_efficiency is None or self.discharge_efficiency is None: - raise ValueError( - "Exactly one of the following sets of parameters must be set: (a) " - "`round_trip_efficiency`, or (b) both `charge_efficiency` " - "and `discharge_efficiency`." - ) - - if self.charge_equals_discharge: - if ( - self.max_discharge_rate is not None - and self.max_discharge_rate != self.max_charge_rate - ): - msg = ( - "Max discharge rate does not equal max charge rate but charge_equals_discharge " - f"is True. Discharge rate is {self.max_discharge_rate} and charge rate " - f"is {self.max_charge_rate}." - ) - raise ValueError(msg) - - self.max_discharge_rate = self.max_charge_rate - - -class PeakLoadManagementOpenLoopStorageController(StorageOpenLoopControlBase): - """ - A controller that manages commodity flow based on demand and storage constraints. - - The `DemandOpenLoopStorageController` computes the dispatch commands for a commodity storage - system. It uses a demand profile and storage parameters to determine how much of the - commodity to charge, discharge, or curtail at each time step. - """ - - def setup(self): - self.config = PeakLoadManagementOpenLoopStorageController.from_dict( - merge_shared_inputs(self.options["tech_config"]["model_inputs"], "control"), - strict=False, - additional_cls_name=self.__class__.__name__, - ) - super().setup() - - self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] - - # Design constraints of storage system - self.add_input( - "max_charge_rate", - val=self.config.max_charge_rate, - units=self.config.commodity_rate_units, - desc="Storage charge/discharge rate", - ) - - self.add_input( - "storage_capacity", - val=self.config.max_capacity, - units=self.config.commodity_amount_units, - desc="Maximum storage capacity", - ) - - if not self.config.charge_equals_discharge: - self.add_input( - "max_discharge_rate", - val=self.config.max_discharge_rate, - units=self.config.commodity_rate_units, - desc="Storage discharge rate", - ) - - def compute(self, inputs, outputs): - """ - Compute storage state of charge (SOC), delivered output, curtailment, and unmet - demand over the simulation horizon. - - This method applies an open-loop storage control strategy to balance the - commodity demand and input flow. When input exceeds demand, excess commodity - is used to charge storage (subject to rate, efficiency, and SOC limits). When - demand exceeds input, storage is discharged to meet the deficit (also subject - to constraints). SOC is updated at each time step, ensuring it remains within - allowable bounds. - - Expected input keys: - * ``_in``: Timeseries of commodity available at each time step. - * ``_demand``: Timeseries demand profile. - * ``max_charge_rate``: Maximum charge rate permitted. - * ``max_capacity``: Maximum total storage capacity. - - Outputs populated: - * ``_set_point``: Dispatch command to storage, - negative when charging, positive when discharging. - - Control logic includes: - * Enforcing SOC limits (min, max, and initial conditions). - * Applying charge and discharge efficiencies. - * Observing charge/discharge rate limits. - * Tracking energy shortfalls and excesses at each time step. - - Raises: - UserWarning: If the demand profile is entirely zero. - UserWarning: If ``max_charge_rate`` or ``max_capacity`` is negative. - - Returns: - None - """ - commodity = self.config.commodity - if np.all(inputs[f"{commodity}_demand"] == 0.0): - msg = "Demand profile is zero, check that demand profile is input" - raise UserWarning(msg) - if inputs["max_charge_rate"][0] < 0: - msg = ( - f"max_charge_rate cannot be less than zero and has value of " - f"{inputs['max_charge_rate']}" - ) - raise UserWarning(msg) - if inputs["storage_capacity"][0] < 0: - msg = ( - f"storage_capacity cannot be less than zero and has value of " - f"{inputs['storage_capacity']}" - ) - raise UserWarning(msg) - - max_capacity = inputs["storage_capacity"].item() - max_charge_rate = inputs["max_charge_rate"].item() - - if self.config.charge_equals_discharge: - max_discharge_rate = inputs["max_charge_rate"].item() - else: - max_discharge_rate = inputs["max_discharge_rate"].item() - - soc_max = self.config.max_soc_fraction - soc_min = self.config.min_soc_fraction - init_soc_fraction = self.config.init_soc_fraction - - charge_eff = float(self.config.charge_efficiency) - discharge_eff = float(self.config.discharge_efficiency) - - # Initialize time-step state of charge prior to loop so the loop starts with - # the previous time step's value - soc = deepcopy(init_soc_fraction) - - demand_profile = inputs[f"{commodity}_demand"] - - # initialize outputs - soc_array = np.zeros(self.n_timesteps) - set_point_array = np.zeros(self.n_timesteps) - combined_output_array = np.zeros(self.n_timesteps) - # Loop through each time step - for t, demand_t in enumerate(demand_profile): - # Get the input flow at the current time step - input_flow = inputs[f"{commodity}_in"][t] - - # Calculate the available charge/discharge capacity - available_charge = float((soc_max - soc) * max_capacity) - available_discharge = float((soc - soc_min) * max_capacity) - - # Determine the output flow based on demand_t and SOC - if demand_t > input_flow: - # Discharge storage to meet demand. - # `discharge_needed` is as seen by the storage - discharge_needed = (demand_t - input_flow) / discharge_eff - # `discharge` is as seen by the storage, but `max_discharge_rate` is as observed - # outside the storage - discharge = min( - discharge_needed, available_discharge, max_discharge_rate / discharge_eff - ) - - soc -= discharge / max_capacity # soc is a ratio with value between 0 and 1 - # output is as observed outside the storage, so we need to adjust `discharge` by - # applying `discharge_efficiency`. - combined_output_array[t] = input_flow + discharge * discharge_eff - set_point_array[t] = discharge * discharge_eff - else: - # Charge storage with unused input - # `unused_input` is as seen outside the storage - unused_input = input_flow - demand_t - unused_input = unused_input.item() - # `charge` is as seen by the storage, but the things being compared should all be as - # seen outside the storage so we need to adjust `available_charge` outside the - # storage view and the final result back into the storage view. - charge = ( - min(unused_input, available_charge / charge_eff, max_charge_rate) * charge_eff - ) - soc += charge / max_capacity # soc is a ratio with value between 0 and 1 - combined_output_array[t] = demand_t - set_point_array[t] = -1 * charge / charge_eff - - # Ensure SOC stays within bounds - soc = max(soc_min, min(soc_max, soc)) - - # Record the SOC for the current time step - soc_array[t] = deepcopy(soc) - - outputs[f"{commodity}_set_point"] = set_point_array diff --git a/h2integrate/control/control_strategies/storage/test/data/lmp_month_1.csv b/h2integrate/control/control_strategies/storage/test/data/lmp_month_1.csv new file mode 100644 index 000000000..3a00a1738 --- /dev/null +++ b/h2integrate/control/control_strategies/storage/test/data/lmp_month_1.csv @@ -0,0 +1,8893 @@ +,time_mountain,energy +84,2024-01-01 00:00:00-07:00,14.4709 +85,2024-01-01 00:05:00-07:00,14.2543 +86,2024-01-01 00:10:00-07:00,14.09 +87,2024-01-01 00:15:00-07:00,13.974 +88,2024-01-01 00:20:00-07:00,13.9882 +89,2024-01-01 00:25:00-07:00,14.0293 +90,2024-01-01 00:30:00-07:00,14.0564 +91,2024-01-01 00:35:00-07:00,14.0322 +92,2024-01-01 00:40:00-07:00,14.0715 +93,2024-01-01 00:45:00-07:00,14.1599 +94,2024-01-01 00:50:00-07:00,14.1266 +95,2024-01-01 00:55:00-07:00,14.1826 +96,2024-01-01 01:00:00-07:00,14.2585 +97,2024-01-01 01:05:00-07:00,14.2091 +98,2024-01-01 01:10:00-07:00,14.3807 +99,2024-01-01 01:15:00-07:00,14.3746 +100,2024-01-01 01:20:00-07:00,14.4303 +101,2024-01-01 01:25:00-07:00,14.4011 +102,2024-01-01 01:30:00-07:00,14.277 +103,2024-01-01 01:35:00-07:00,14.0051 +104,2024-01-01 01:40:00-07:00,13.7835 +105,2024-01-01 01:45:00-07:00,14.1808 +106,2024-01-01 01:50:00-07:00,14.0534 +107,2024-01-01 01:55:00-07:00,14.0508 +108,2024-01-01 02:00:00-07:00,13.9783 +109,2024-01-01 02:05:00-07:00,13.9329 +110,2024-01-01 02:10:00-07:00,13.9698 +111,2024-01-01 02:15:00-07:00,13.9803 +112,2024-01-01 02:20:00-07:00,13.93 +113,2024-01-01 02:25:00-07:00,13.8413 +114,2024-01-01 02:30:00-07:00,13.7848 +115,2024-01-01 02:35:00-07:00,13.7598 +116,2024-01-01 02:40:00-07:00,13.6354 +117,2024-01-01 02:45:00-07:00,13.5915 +118,2024-01-01 02:50:00-07:00,13.6491 +119,2024-01-01 02:55:00-07:00,13.7641 +120,2024-01-01 03:00:00-07:00,13.8986 +121,2024-01-01 03:05:00-07:00,13.9516 +122,2024-01-01 03:10:00-07:00,13.9633 +123,2024-01-01 03:15:00-07:00,14.0117 +124,2024-01-01 03:20:00-07:00,14.0749 +125,2024-01-01 03:25:00-07:00,14.2014 +126,2024-01-01 03:30:00-07:00,14.7236 +127,2024-01-01 03:35:00-07:00,16.9246 +128,2024-01-01 03:40:00-07:00,16.9991 +129,2024-01-01 03:45:00-07:00,17.2135 +130,2024-01-01 03:50:00-07:00,17.4733 +131,2024-01-01 03:55:00-07:00,16.7077 +132,2024-01-01 04:00:00-07:00,16.4889 +133,2024-01-01 04:05:00-07:00,16.9839 +134,2024-01-01 04:10:00-07:00,17.179 +135,2024-01-01 04:15:00-07:00,17.1394 +136,2024-01-01 04:20:00-07:00,17.0737 +137,2024-01-01 04:25:00-07:00,17.0264 +138,2024-01-01 04:30:00-07:00,17.2199 +139,2024-01-01 04:35:00-07:00,17.4235 +140,2024-01-01 04:40:00-07:00,17.539 +141,2024-01-01 04:45:00-07:00,17.6646 +142,2024-01-01 04:50:00-07:00,18.0706 +143,2024-01-01 04:55:00-07:00,17.9393 +144,2024-01-01 05:00:00-07:00,17.5895 +145,2024-01-01 05:05:00-07:00,17.5081 +146,2024-01-01 05:10:00-07:00,17.2896 +147,2024-01-01 05:15:00-07:00,17.068 +148,2024-01-01 05:20:00-07:00,16.8998 +149,2024-01-01 05:25:00-07:00,16.7874 +150,2024-01-01 05:30:00-07:00,17.0131 +151,2024-01-01 05:35:00-07:00,17.0888 +152,2024-01-01 05:40:00-07:00,17.1645 +153,2024-01-01 05:45:00-07:00,17.3858 +154,2024-01-01 05:50:00-07:00,18.2147 +155,2024-01-01 05:55:00-07:00,17.6241 +156,2024-01-01 06:00:00-07:00,17.2868 +157,2024-01-01 06:05:00-07:00,17.3819 +158,2024-01-01 06:10:00-07:00,18.1819 +159,2024-01-01 06:15:00-07:00,18.2046 +160,2024-01-01 06:20:00-07:00,18.0646 +161,2024-01-01 06:25:00-07:00,17.9391 +162,2024-01-01 06:30:00-07:00,17.857 +163,2024-01-01 06:35:00-07:00,17.991 +164,2024-01-01 06:40:00-07:00,18.1777 +165,2024-01-01 06:45:00-07:00,18.2836 +166,2024-01-01 06:50:00-07:00,19.5607 +167,2024-01-01 06:55:00-07:00,19.5731 +168,2024-01-01 07:00:00-07:00,19.0701 +169,2024-01-01 07:05:00-07:00,19.7728 +170,2024-01-01 07:10:00-07:00,19.4764 +171,2024-01-01 07:15:00-07:00,19.5374 +172,2024-01-01 07:20:00-07:00,19.2645 +173,2024-01-01 07:25:00-07:00,19.9813 +174,2024-01-01 07:30:00-07:00,19.7769 +175,2024-01-01 07:35:00-07:00,19.8233 +176,2024-01-01 07:40:00-07:00,20.1913 +177,2024-01-01 07:45:00-07:00,19.8421 +178,2024-01-01 07:50:00-07:00,19.1274 +179,2024-01-01 07:55:00-07:00,18.3059 +180,2024-01-01 08:00:00-07:00,15.3611 +181,2024-01-01 08:05:00-07:00,19.2258 +182,2024-01-01 08:10:00-07:00,19.2072 +183,2024-01-01 08:15:00-07:00,18.2634 +184,2024-01-01 08:20:00-07:00,14.7571 +185,2024-01-01 08:25:00-07:00,15.0793 +186,2024-01-01 08:30:00-07:00,15.225 +187,2024-01-01 08:35:00-07:00,14.8927 +188,2024-01-01 08:40:00-07:00,14.5229 +189,2024-01-01 08:45:00-07:00,14.145 +190,2024-01-01 08:50:00-07:00,13.6981 +191,2024-01-01 08:55:00-07:00,13.5657 +192,2024-01-01 09:00:00-07:00,13.4419 +193,2024-01-01 09:05:00-07:00,13.3199 +194,2024-01-01 09:10:00-07:00,13.5033 +195,2024-01-01 09:15:00-07:00,13.6845 +196,2024-01-01 09:20:00-07:00,13.928 +197,2024-01-01 09:25:00-07:00,13.8571 +198,2024-01-01 09:30:00-07:00,14.0134 +199,2024-01-01 09:35:00-07:00,14.1107 +200,2024-01-01 09:40:00-07:00,14.3239 +201,2024-01-01 09:45:00-07:00,14.3263 +202,2024-01-01 09:50:00-07:00,14.1871 +203,2024-01-01 09:55:00-07:00,14.2882 +204,2024-01-01 10:00:00-07:00,14.3606 +205,2024-01-01 10:05:00-07:00,14.4352 +206,2024-01-01 10:10:00-07:00,14.979 +207,2024-01-01 10:15:00-07:00,15.0849 +208,2024-01-01 10:20:00-07:00,15.103 +209,2024-01-01 10:25:00-07:00,16.8241 +210,2024-01-01 10:30:00-07:00,16.4471 +211,2024-01-01 10:35:00-07:00,15.5045 +212,2024-01-01 10:40:00-07:00,15.393 +213,2024-01-01 10:45:00-07:00,15.3177 +214,2024-01-01 10:50:00-07:00,15.2276 +215,2024-01-01 10:55:00-07:00,16.7949 +216,2024-01-01 11:00:00-07:00,16.8664 +217,2024-01-01 11:05:00-07:00,17.0937 +218,2024-01-01 11:10:00-07:00,17.7821 +219,2024-01-01 11:15:00-07:00,19.2977 +220,2024-01-01 11:20:00-07:00,17.8514 +221,2024-01-01 11:25:00-07:00,17.8621 +222,2024-01-01 11:30:00-07:00,17.9027 +223,2024-01-01 11:35:00-07:00,18.0088 +224,2024-01-01 11:40:00-07:00,18.1564 +225,2024-01-01 11:45:00-07:00,14.3288 +226,2024-01-01 11:50:00-07:00,15.115 +227,2024-01-01 11:55:00-07:00,17.2108 +228,2024-01-01 12:00:00-07:00,17.3333 +229,2024-01-01 12:05:00-07:00,17.0426 +230,2024-01-01 12:10:00-07:00,17.3084 +231,2024-01-01 12:15:00-07:00,17.2986 +232,2024-01-01 12:20:00-07:00,17.2933 +233,2024-01-01 12:25:00-07:00,17.2537 +234,2024-01-01 12:30:00-07:00,17.3159 +235,2024-01-01 12:35:00-07:00,17.3456 +236,2024-01-01 12:40:00-07:00,17.1736 +237,2024-01-01 12:45:00-07:00,16.9879 +238,2024-01-01 12:50:00-07:00,16.9594 +239,2024-01-01 12:55:00-07:00,16.9255 +240,2024-01-01 13:00:00-07:00,16.835 +241,2024-01-01 13:05:00-07:00,15.7599 +242,2024-01-01 13:10:00-07:00,16.8574 +243,2024-01-01 13:15:00-07:00,16.7574 +244,2024-01-01 13:20:00-07:00,14.8924 +245,2024-01-01 13:25:00-07:00,14.7397 +246,2024-01-01 13:30:00-07:00,14.5687 +247,2024-01-01 13:35:00-07:00,14.9644 +248,2024-01-01 13:40:00-07:00,14.6715 +249,2024-01-01 13:45:00-07:00,15.2197 +250,2024-01-01 13:50:00-07:00,14.5744 +251,2024-01-01 13:55:00-07:00,14.5754 +252,2024-01-01 14:00:00-07:00,14.5955 +253,2024-01-01 14:05:00-07:00,14.6317 +254,2024-01-01 14:10:00-07:00,15.2513 +255,2024-01-01 14:15:00-07:00,16.7028 +256,2024-01-01 14:20:00-07:00,16.9068 +257,2024-01-01 14:25:00-07:00,17.6341 +258,2024-01-01 14:30:00-07:00,20.6208 +259,2024-01-01 14:35:00-07:00,19.2319 +260,2024-01-01 14:40:00-07:00,19.1845 +261,2024-01-01 14:45:00-07:00,17.9511 +262,2024-01-01 14:50:00-07:00,20.8624 +263,2024-01-01 14:55:00-07:00,19.1728 +264,2024-01-01 15:00:00-07:00,19.8637 +265,2024-01-01 15:05:00-07:00,20.5805 +266,2024-01-01 15:10:00-07:00,20.591 +267,2024-01-01 15:15:00-07:00,23.2274 +268,2024-01-01 15:20:00-07:00,23.2967 +269,2024-01-01 15:25:00-07:00,23.631 +270,2024-01-01 15:30:00-07:00,22.6035 +271,2024-01-01 15:35:00-07:00,23.2104 +272,2024-01-01 15:40:00-07:00,23.0702 +273,2024-01-01 15:45:00-07:00,22.8719 +274,2024-01-01 15:50:00-07:00,22.7064 +275,2024-01-01 15:55:00-07:00,24.2862 +276,2024-01-01 16:00:00-07:00,17.7766 +277,2024-01-01 16:05:00-07:00,18.7743 +278,2024-01-01 16:10:00-07:00,23.2157 +279,2024-01-01 16:15:00-07:00,19.1054 +280,2024-01-01 16:20:00-07:00,13.5336 +281,2024-01-01 16:25:00-07:00,13.636 +282,2024-01-01 16:30:00-07:00,17.32 +283,2024-01-01 16:35:00-07:00,18.273 +284,2024-01-01 16:40:00-07:00,18.7699 +285,2024-01-01 16:45:00-07:00,18.9483 +286,2024-01-01 16:50:00-07:00,20.5487 +287,2024-01-01 16:55:00-07:00,23.2437 +288,2024-01-01 17:00:00-07:00,23.2817 +289,2024-01-01 17:05:00-07:00,23.586 +290,2024-01-01 17:10:00-07:00,23.3191 +291,2024-01-01 17:15:00-07:00,23.2061 +292,2024-01-01 17:20:00-07:00,25.2831 +293,2024-01-01 17:25:00-07:00,24.1641 +294,2024-01-01 17:30:00-07:00,23.6245 +295,2024-01-01 17:35:00-07:00,23.8394 +296,2024-01-01 17:40:00-07:00,23.9592 +297,2024-01-01 17:45:00-07:00,23.943 +298,2024-01-01 17:50:00-07:00,23.9345 +299,2024-01-01 17:55:00-07:00,23.9 +300,2024-01-01 18:00:00-07:00,23.3864 +301,2024-01-01 18:05:00-07:00,23.2942 +302,2024-01-01 18:10:00-07:00,22.7976 +303,2024-01-01 18:15:00-07:00,22.1812 +304,2024-01-01 18:20:00-07:00,22.0331 +305,2024-01-01 18:25:00-07:00,21.7754 +306,2024-01-01 18:30:00-07:00,21.4332 +307,2024-01-01 18:35:00-07:00,21.1202 +308,2024-01-01 18:40:00-07:00,21.0377 +309,2024-01-01 18:45:00-07:00,19.903 +310,2024-01-01 18:50:00-07:00,20.0181 +311,2024-01-01 18:55:00-07:00,20.1465 +312,2024-01-01 19:00:00-07:00,20.7034 +313,2024-01-01 19:05:00-07:00,21.4078 +314,2024-01-01 19:10:00-07:00,19.6059 +315,2024-01-01 19:15:00-07:00,20.9563 +316,2024-01-01 19:20:00-07:00,21.0053 +317,2024-01-01 19:25:00-07:00,21.0964 +318,2024-01-01 19:30:00-07:00,20.9541 +319,2024-01-01 19:35:00-07:00,20.6957 +320,2024-01-01 19:40:00-07:00,20.2189 +321,2024-01-01 19:45:00-07:00,20.0627 +322,2024-01-01 19:50:00-07:00,19.5535 +323,2024-01-01 19:55:00-07:00,19.5684 +324,2024-01-01 20:00:00-07:00,19.6672 +325,2024-01-01 20:05:00-07:00,19.8159 +326,2024-01-01 20:10:00-07:00,19.8869 +327,2024-01-01 20:15:00-07:00,20.3752 +328,2024-01-01 20:20:00-07:00,20.533 +329,2024-01-01 20:25:00-07:00,20.1634 +330,2024-01-01 20:30:00-07:00,19.9305 +331,2024-01-01 20:35:00-07:00,19.6086 +332,2024-01-01 20:40:00-07:00,19.4672 +333,2024-01-01 20:45:00-07:00,19.2092 +334,2024-01-01 20:50:00-07:00,19.0383 +335,2024-01-01 20:55:00-07:00,18.9173 +336,2024-01-01 21:00:00-07:00,19.5027 +337,2024-01-01 21:05:00-07:00,19.9982 +338,2024-01-01 21:10:00-07:00,19.0315 +339,2024-01-01 21:15:00-07:00,18.8555 +340,2024-01-01 21:20:00-07:00,18.7854 +341,2024-01-01 21:25:00-07:00,18.785 +342,2024-01-01 21:30:00-07:00,18.6576 +343,2024-01-01 21:35:00-07:00,18.5102 +344,2024-01-01 21:40:00-07:00,18.4917 +345,2024-01-01 21:45:00-07:00,18.3805 +346,2024-01-01 21:50:00-07:00,17.5835 +347,2024-01-01 21:55:00-07:00,14.8931 +348,2024-01-01 22:00:00-07:00,15.3282 +349,2024-01-01 22:05:00-07:00,17.8685 +350,2024-01-01 22:10:00-07:00,15.5328 +351,2024-01-01 22:15:00-07:00,16.8655 +352,2024-01-01 22:20:00-07:00,17.2154 +353,2024-01-01 22:25:00-07:00,17.7341 +354,2024-01-01 22:30:00-07:00,17.3563 +355,2024-01-01 22:35:00-07:00,17.5334 +356,2024-01-01 22:40:00-07:00,17.3711 +357,2024-01-01 22:45:00-07:00,17.1764 +358,2024-01-01 22:50:00-07:00,17.4917 +359,2024-01-01 22:55:00-07:00,17.5255 +360,2024-01-01 23:00:00-07:00,17.6067 +361,2024-01-01 23:05:00-07:00,17.4426 +362,2024-01-01 23:10:00-07:00,17.0874 +363,2024-01-01 23:15:00-07:00,16.1182 +364,2024-01-01 23:20:00-07:00,14.9437 +365,2024-01-01 23:25:00-07:00,14.7088 +366,2024-01-01 23:30:00-07:00,14.6414 +367,2024-01-01 23:35:00-07:00,14.3989 +368,2024-01-01 23:40:00-07:00,14.4714 +369,2024-01-01 23:45:00-07:00,14.5166 +370,2024-01-01 23:50:00-07:00,14.4947 +371,2024-01-01 23:55:00-07:00,14.9914 +372,2024-01-02 00:00:00-07:00,19.4493 +373,2024-01-02 00:05:00-07:00,15.3898 +374,2024-01-02 00:10:00-07:00,15.2416 +375,2024-01-02 00:15:00-07:00,15.0994 +376,2024-01-02 00:20:00-07:00,15.054 +377,2024-01-02 00:25:00-07:00,14.9017 +378,2024-01-02 00:30:00-07:00,14.6894 +379,2024-01-02 00:35:00-07:00,14.5947 +380,2024-01-02 00:40:00-07:00,14.5937 +381,2024-01-02 00:45:00-07:00,14.6114 +382,2024-01-02 00:50:00-07:00,14.5395 +383,2024-01-02 00:55:00-07:00,14.525 +384,2024-01-02 01:00:00-07:00,14.3933 +385,2024-01-02 01:05:00-07:00,14.3515 +386,2024-01-02 01:10:00-07:00,14.3402 +387,2024-01-02 01:15:00-07:00,14.3128 +388,2024-01-02 01:20:00-07:00,14.6421 +389,2024-01-02 01:25:00-07:00,14.6265 +390,2024-01-02 01:30:00-07:00,14.5971 +391,2024-01-02 01:35:00-07:00,14.5476 +392,2024-01-02 01:40:00-07:00,14.548 +393,2024-01-02 01:45:00-07:00,14.5141 +394,2024-01-02 01:50:00-07:00,14.1814 +395,2024-01-02 01:55:00-07:00,14.1835 +396,2024-01-02 02:00:00-07:00,16.3981 +397,2024-01-02 02:05:00-07:00,19.5871 +398,2024-01-02 02:10:00-07:00,14.2361 +399,2024-01-02 02:15:00-07:00,14.2726 +400,2024-01-02 02:20:00-07:00,14.3376 +401,2024-01-02 02:25:00-07:00,17.0513 +402,2024-01-02 02:30:00-07:00,14.4402 +403,2024-01-02 02:35:00-07:00,14.4433 +404,2024-01-02 02:40:00-07:00,25.494 +405,2024-01-02 02:45:00-07:00,14.5919 +406,2024-01-02 02:50:00-07:00,14.947 +407,2024-01-02 02:55:00-07:00,20.5193 +408,2024-01-02 03:00:00-07:00,23.228 +409,2024-01-02 03:05:00-07:00,21.6425 +410,2024-01-02 03:10:00-07:00,18.4352 +411,2024-01-02 03:15:00-07:00,17.7317 +412,2024-01-02 03:20:00-07:00,17.696 +413,2024-01-02 03:25:00-07:00,17.8156 +414,2024-01-02 03:30:00-07:00,17.8349 +415,2024-01-02 03:35:00-07:00,17.4948 +416,2024-01-02 03:40:00-07:00,17.3466 +417,2024-01-02 03:45:00-07:00,17.4323 +418,2024-01-02 03:50:00-07:00,17.5548 +419,2024-01-02 03:55:00-07:00,17.5526 +420,2024-01-02 04:00:00-07:00,17.6944 +421,2024-01-02 04:05:00-07:00,20.0305 +422,2024-01-02 04:10:00-07:00,18.6397 +423,2024-01-02 04:15:00-07:00,19.1744 +424,2024-01-02 04:20:00-07:00,18.6356 +425,2024-01-02 04:25:00-07:00,18.8633 +426,2024-01-02 04:30:00-07:00,19.7566 +427,2024-01-02 04:35:00-07:00,20.3488 +428,2024-01-02 04:40:00-07:00,21.618 +429,2024-01-02 04:45:00-07:00,22.0107 +430,2024-01-02 04:50:00-07:00,22.6094 +431,2024-01-02 04:55:00-07:00,23.4921 +432,2024-01-02 05:00:00-07:00,23.4633 +433,2024-01-02 05:05:00-07:00,23.5934 +434,2024-01-02 05:10:00-07:00,23.1225 +435,2024-01-02 05:15:00-07:00,23.164 +436,2024-01-02 05:20:00-07:00,23.2041 +437,2024-01-02 05:25:00-07:00,23.1949 +438,2024-01-02 05:30:00-07:00,23.1857 +439,2024-01-02 05:35:00-07:00,23.2251 +440,2024-01-02 05:40:00-07:00,22.8238 +441,2024-01-02 05:45:00-07:00,23.5272 +442,2024-01-02 05:50:00-07:00,25.1253 +443,2024-01-02 05:55:00-07:00,21.4161 +444,2024-01-02 06:00:00-07:00,22.3895 +445,2024-01-02 06:05:00-07:00,22.9188 +446,2024-01-02 06:10:00-07:00,23.5671 +447,2024-01-02 06:15:00-07:00,22.8401 +448,2024-01-02 06:20:00-07:00,22.9877 +449,2024-01-02 06:25:00-07:00,23.034 +450,2024-01-02 06:30:00-07:00,23.5413 +451,2024-01-02 06:35:00-07:00,23.8472 +452,2024-01-02 06:40:00-07:00,25.0627 +453,2024-01-02 06:45:00-07:00,33.029 +454,2024-01-02 06:50:00-07:00,30.0837 +455,2024-01-02 06:55:00-07:00,33.168 +456,2024-01-02 07:00:00-07:00,26.5165 +457,2024-01-02 07:05:00-07:00,33.2925 +458,2024-01-02 07:10:00-07:00,26.36 +459,2024-01-02 07:15:00-07:00,34.5369 +460,2024-01-02 07:20:00-07:00,33.7651 +461,2024-01-02 07:25:00-07:00,35.7694 +462,2024-01-02 07:30:00-07:00,35.7537 +463,2024-01-02 07:35:00-07:00,35.7913 +464,2024-01-02 07:40:00-07:00,35.7484 +465,2024-01-02 07:45:00-07:00,35.7338 +466,2024-01-02 07:50:00-07:00,35.7527 +467,2024-01-02 07:55:00-07:00,35.6638 +468,2024-01-02 08:00:00-07:00,35.6424 +469,2024-01-02 08:05:00-07:00,35.1301 +470,2024-01-02 08:10:00-07:00,27.6096 +471,2024-01-02 08:15:00-07:00,35.7291 +472,2024-01-02 08:20:00-07:00,35.7725 +473,2024-01-02 08:25:00-07:00,25.2584 +474,2024-01-02 08:30:00-07:00,23.9389 +475,2024-01-02 08:35:00-07:00,21.3538 +476,2024-01-02 08:40:00-07:00,18.4993 +477,2024-01-02 08:45:00-07:00,22.6815 +478,2024-01-02 08:50:00-07:00,18.8247 +479,2024-01-02 08:55:00-07:00,14.9716 +480,2024-01-02 09:00:00-07:00,14.777 +481,2024-01-02 09:05:00-07:00,17.003 +482,2024-01-02 09:10:00-07:00,18.2476 +483,2024-01-02 09:15:00-07:00,18.2934 +484,2024-01-02 09:20:00-07:00,18.2177 +485,2024-01-02 09:25:00-07:00,18.958 +486,2024-01-02 09:30:00-07:00,18.643 +487,2024-01-02 09:35:00-07:00,18.4192 +488,2024-01-02 09:40:00-07:00,18.2939 +489,2024-01-02 09:45:00-07:00,18.2772 +490,2024-01-02 09:50:00-07:00,17.4544 +491,2024-01-02 09:55:00-07:00,16.5659 +492,2024-01-02 10:00:00-07:00,17.3554 +493,2024-01-02 10:05:00-07:00,17.396 +494,2024-01-02 10:10:00-07:00,18.0465 +495,2024-01-02 10:15:00-07:00,17.8897 +496,2024-01-02 10:20:00-07:00,17.8552 +497,2024-01-02 10:25:00-07:00,17.9179 +498,2024-01-02 10:30:00-07:00,17.9915 +499,2024-01-02 10:35:00-07:00,18.0885 +500,2024-01-02 10:40:00-07:00,18.1966 +501,2024-01-02 10:45:00-07:00,18.9856 +502,2024-01-02 10:50:00-07:00,18.2301 +503,2024-01-02 10:55:00-07:00,18.2485 +504,2024-01-02 11:00:00-07:00,18.3302 +505,2024-01-02 11:05:00-07:00,18.4286 +506,2024-01-02 11:10:00-07:00,18.4072 +507,2024-01-02 11:15:00-07:00,18.2596 +508,2024-01-02 11:20:00-07:00,18.0346 +509,2024-01-02 11:25:00-07:00,17.7311 +510,2024-01-02 11:30:00-07:00,17.6194 +511,2024-01-02 11:35:00-07:00,15.0886 +512,2024-01-02 11:40:00-07:00,15.1932 +513,2024-01-02 11:45:00-07:00,16.2084 +514,2024-01-02 11:50:00-07:00,16.8929 +515,2024-01-02 11:55:00-07:00,16.9212 +516,2024-01-02 12:00:00-07:00,16.8671 +517,2024-01-02 12:05:00-07:00,16.8833 +518,2024-01-02 12:10:00-07:00,16.7646 +519,2024-01-02 12:15:00-07:00,16.6147 +520,2024-01-02 12:20:00-07:00,16.5805 +521,2024-01-02 12:25:00-07:00,16.8153 +522,2024-01-02 12:30:00-07:00,16.8191 +523,2024-01-02 12:35:00-07:00,16.6129 +524,2024-01-02 12:40:00-07:00,16.0846 +525,2024-01-02 12:45:00-07:00,15.2939 +526,2024-01-02 12:50:00-07:00,15.4576 +527,2024-01-02 12:55:00-07:00,15.6063 +528,2024-01-02 13:00:00-07:00,15.8574 +529,2024-01-02 13:05:00-07:00,15.8031 +530,2024-01-02 13:10:00-07:00,15.7756 +531,2024-01-02 13:15:00-07:00,15.1885 +532,2024-01-02 13:20:00-07:00,15.1716 +533,2024-01-02 13:25:00-07:00,15.1558 +534,2024-01-02 13:30:00-07:00,15.156 +535,2024-01-02 13:35:00-07:00,15.1025 +536,2024-01-02 13:40:00-07:00,14.858 +537,2024-01-02 13:45:00-07:00,14.7562 +538,2024-01-02 13:50:00-07:00,14.7472 +539,2024-01-02 13:55:00-07:00,14.6261 +540,2024-01-02 14:00:00-07:00,14.6347 +541,2024-01-02 14:05:00-07:00,14.6489 +542,2024-01-02 14:10:00-07:00,14.562 +543,2024-01-02 14:15:00-07:00,14.5641 +544,2024-01-02 14:20:00-07:00,14.5409 +545,2024-01-02 14:25:00-07:00,14.5216 +546,2024-01-02 14:30:00-07:00,14.4861 +547,2024-01-02 14:35:00-07:00,14.4885 +548,2024-01-02 14:40:00-07:00,14.4925 +549,2024-01-02 14:45:00-07:00,14.4845 +550,2024-01-02 14:50:00-07:00,14.5151 +551,2024-01-02 14:55:00-07:00,14.5166 +552,2024-01-02 15:00:00-07:00,14.3851 +553,2024-01-02 15:05:00-07:00,14.4518 +554,2024-01-02 15:10:00-07:00,14.4336 +555,2024-01-02 15:15:00-07:00,15.1622 +556,2024-01-02 15:20:00-07:00,14.6996 +557,2024-01-02 15:25:00-07:00,14.96 +558,2024-01-02 15:30:00-07:00,15.6115 +559,2024-01-02 15:35:00-07:00,19.1066 +560,2024-01-02 15:40:00-07:00,17.8968 +561,2024-01-02 15:45:00-07:00,21.6643 +562,2024-01-02 15:50:00-07:00,19.7702 +563,2024-01-02 15:55:00-07:00,19.4724 +564,2024-01-02 16:00:00-07:00,19.3628 +565,2024-01-02 16:05:00-07:00,18.989 +566,2024-01-02 16:10:00-07:00,17.6369 +567,2024-01-02 16:15:00-07:00,26.6784 +568,2024-01-02 16:20:00-07:00,18.9032 +569,2024-01-02 16:25:00-07:00,19.1945 +570,2024-01-02 16:30:00-07:00,28.7555 +571,2024-01-02 16:35:00-07:00,19.1107 +572,2024-01-02 16:40:00-07:00,19.8668 +573,2024-01-02 16:45:00-07:00,20.4165 +574,2024-01-02 16:50:00-07:00,21.6061 +575,2024-01-02 16:55:00-07:00,23.238 +576,2024-01-02 17:00:00-07:00,23.3233 +577,2024-01-02 17:05:00-07:00,23.3004 +578,2024-01-02 17:10:00-07:00,23.8688 +579,2024-01-02 17:15:00-07:00,23.2421 +580,2024-01-02 17:20:00-07:00,23.336 +581,2024-01-02 17:25:00-07:00,23.318 +582,2024-01-02 17:30:00-07:00,23.1912 +583,2024-01-02 17:35:00-07:00,22.7852 +584,2024-01-02 17:40:00-07:00,22.8918 +585,2024-01-02 17:45:00-07:00,22.9805 +586,2024-01-02 17:50:00-07:00,22.745 +587,2024-01-02 17:55:00-07:00,22.3121 +588,2024-01-02 18:00:00-07:00,21.7231 +589,2024-01-02 18:05:00-07:00,21.5874 +590,2024-01-02 18:10:00-07:00,21.9475 +591,2024-01-02 18:15:00-07:00,23.4336 +592,2024-01-02 18:20:00-07:00,22.9323 +593,2024-01-02 18:25:00-07:00,21.7928 +594,2024-01-02 18:30:00-07:00,21.897 +595,2024-01-02 18:35:00-07:00,21.3454 +596,2024-01-02 18:40:00-07:00,21.1799 +597,2024-01-02 18:45:00-07:00,22.7305 +598,2024-01-02 18:50:00-07:00,20.3385 +599,2024-01-02 18:55:00-07:00,21.5389 +600,2024-01-02 19:00:00-07:00,21.5759 +601,2024-01-02 19:05:00-07:00,21.3512 +602,2024-01-02 19:10:00-07:00,21.7058 +603,2024-01-02 19:15:00-07:00,21.9079 +604,2024-01-02 19:20:00-07:00,22.2154 +605,2024-01-02 19:25:00-07:00,22.7305 +606,2024-01-02 19:30:00-07:00,22.327 +607,2024-01-02 19:35:00-07:00,21.7939 +608,2024-01-02 19:40:00-07:00,21.537 +609,2024-01-02 19:45:00-07:00,21.5343 +610,2024-01-02 19:50:00-07:00,20.627 +611,2024-01-02 19:55:00-07:00,27.933 +612,2024-01-02 20:00:00-07:00,28.0389 +613,2024-01-02 20:05:00-07:00,23.9563 +614,2024-01-02 20:10:00-07:00,24.037 +615,2024-01-02 20:15:00-07:00,23.4887 +616,2024-01-02 20:20:00-07:00,23.5047 +617,2024-01-02 20:25:00-07:00,23.1054 +618,2024-01-02 20:30:00-07:00,23.0266 +619,2024-01-02 20:35:00-07:00,22.9957 +620,2024-01-02 20:40:00-07:00,23.0016 +621,2024-01-02 20:45:00-07:00,22.1525 +622,2024-01-02 20:50:00-07:00,21.7186 +623,2024-01-02 20:55:00-07:00,21.6262 +624,2024-01-02 21:00:00-07:00,22.076 +625,2024-01-02 21:05:00-07:00,21.634 +626,2024-01-02 21:10:00-07:00,21.6989 +627,2024-01-02 21:15:00-07:00,21.3909 +628,2024-01-02 21:20:00-07:00,20.3315 +629,2024-01-02 21:25:00-07:00,19.143 +630,2024-01-02 21:30:00-07:00,18.4546 +631,2024-01-02 21:35:00-07:00,17.8089 +632,2024-01-02 21:40:00-07:00,17.3176 +633,2024-01-02 21:45:00-07:00,16.9933 +634,2024-01-02 21:50:00-07:00,17.9309 +635,2024-01-02 21:55:00-07:00,17.418 +636,2024-01-02 22:00:00-07:00,17.4595 +637,2024-01-02 22:05:00-07:00,19.7494 +638,2024-01-02 22:10:00-07:00,19.6881 +639,2024-01-02 22:15:00-07:00,19.1582 +640,2024-01-02 22:20:00-07:00,18.2707 +641,2024-01-02 22:25:00-07:00,17.5648 +642,2024-01-02 22:30:00-07:00,17.2741 +643,2024-01-02 22:35:00-07:00,17.6319 +644,2024-01-02 22:40:00-07:00,17.7219 +645,2024-01-02 22:45:00-07:00,17.6601 +646,2024-01-02 22:50:00-07:00,17.0573 +647,2024-01-02 22:55:00-07:00,14.5489 +648,2024-01-02 23:00:00-07:00,14.9153 +649,2024-01-02 23:05:00-07:00,16.626 +650,2024-01-02 23:10:00-07:00,17.9426 +651,2024-01-02 23:15:00-07:00,21.8844 +652,2024-01-02 23:20:00-07:00,17.1603 +653,2024-01-02 23:25:00-07:00,17.06 +654,2024-01-02 23:30:00-07:00,16.8924 +655,2024-01-02 23:35:00-07:00,16.9571 +656,2024-01-02 23:40:00-07:00,16.9002 +657,2024-01-02 23:45:00-07:00,16.6726 +658,2024-01-02 23:50:00-07:00,16.3476 +659,2024-01-02 23:55:00-07:00,16.6626 +660,2024-01-03 00:00:00-07:00,17.492 +661,2024-01-03 00:05:00-07:00,17.5538 +662,2024-01-03 00:10:00-07:00,17.5837 +663,2024-01-03 00:15:00-07:00,17.4163 +664,2024-01-03 00:20:00-07:00,17.4424 +665,2024-01-03 00:25:00-07:00,17.4869 +666,2024-01-03 00:30:00-07:00,17.3326 +667,2024-01-03 00:35:00-07:00,16.0497 +668,2024-01-03 00:40:00-07:00,15.6974 +669,2024-01-03 00:45:00-07:00,14.4987 +670,2024-01-03 00:50:00-07:00,14.9593 +671,2024-01-03 00:55:00-07:00,14.3606 +672,2024-01-03 01:00:00-07:00,14.3514 +673,2024-01-03 01:05:00-07:00,14.4969 +674,2024-01-03 01:10:00-07:00,14.4024 +675,2024-01-03 01:15:00-07:00,14.4603 +676,2024-01-03 01:20:00-07:00,14.3729 +677,2024-01-03 01:25:00-07:00,14.5047 +678,2024-01-03 01:30:00-07:00,14.5257 +679,2024-01-03 01:35:00-07:00,14.5423 +680,2024-01-03 01:40:00-07:00,14.3831 +681,2024-01-03 01:45:00-07:00,14.3969 +682,2024-01-03 01:50:00-07:00,14.2748 +683,2024-01-03 01:55:00-07:00,14.2761 +684,2024-01-03 02:00:00-07:00,14.3148 +685,2024-01-03 02:05:00-07:00,14.2695 +686,2024-01-03 02:10:00-07:00,14.0625 +687,2024-01-03 02:15:00-07:00,14.0619 +688,2024-01-03 02:20:00-07:00,14.0961 +689,2024-01-03 02:25:00-07:00,14.1397 +690,2024-01-03 02:30:00-07:00,14.2069 +691,2024-01-03 02:35:00-07:00,14.2109 +692,2024-01-03 02:40:00-07:00,14.2546 +693,2024-01-03 02:45:00-07:00,14.231 +694,2024-01-03 02:50:00-07:00,14.2091 +695,2024-01-03 02:55:00-07:00,14.3944 +696,2024-01-03 03:00:00-07:00,14.6539 +697,2024-01-03 03:05:00-07:00,14.6989 +698,2024-01-03 03:10:00-07:00,14.7198 +699,2024-01-03 03:15:00-07:00,14.6237 +700,2024-01-03 03:20:00-07:00,14.6862 +701,2024-01-03 03:25:00-07:00,15.3257 +702,2024-01-03 03:30:00-07:00,15.8885 +703,2024-01-03 03:35:00-07:00,16.4981 +704,2024-01-03 03:40:00-07:00,16.9194 +705,2024-01-03 03:45:00-07:00,17.6248 +706,2024-01-03 03:50:00-07:00,17.948 +707,2024-01-03 03:55:00-07:00,19.4218 +708,2024-01-03 04:00:00-07:00,18.6068 +709,2024-01-03 04:05:00-07:00,18.4817 +710,2024-01-03 04:10:00-07:00,18.6278 +711,2024-01-03 04:15:00-07:00,18.7304 +712,2024-01-03 04:20:00-07:00,19.075 +713,2024-01-03 04:25:00-07:00,19.4701 +714,2024-01-03 04:30:00-07:00,19.5229 +715,2024-01-03 04:35:00-07:00,19.7436 +716,2024-01-03 04:40:00-07:00,19.8925 +717,2024-01-03 04:45:00-07:00,20.1874 +718,2024-01-03 04:50:00-07:00,21.3177 +719,2024-01-03 04:55:00-07:00,20.2538 +720,2024-01-03 05:00:00-07:00,14.8535 +721,2024-01-03 05:05:00-07:00,19.0099 +722,2024-01-03 05:10:00-07:00,21.5279 +723,2024-01-03 05:15:00-07:00,19.6723 +724,2024-01-03 05:20:00-07:00,19.3796 +725,2024-01-03 05:25:00-07:00,20.1751 +726,2024-01-03 05:30:00-07:00,21.1798 +727,2024-01-03 05:35:00-07:00,21.5209 +728,2024-01-03 05:40:00-07:00,22.5151 +729,2024-01-03 05:45:00-07:00,22.9296 +730,2024-01-03 05:50:00-07:00,23.2117 +731,2024-01-03 05:55:00-07:00,22.5341 +732,2024-01-03 06:00:00-07:00,20.916 +733,2024-01-03 06:05:00-07:00,21.6094 +734,2024-01-03 06:10:00-07:00,21.4437 +735,2024-01-03 06:15:00-07:00,21.1126 +736,2024-01-03 06:20:00-07:00,18.5784 +737,2024-01-03 06:25:00-07:00,21.7188 +738,2024-01-03 06:30:00-07:00,21.7311 +739,2024-01-03 06:35:00-07:00,20.5947 +740,2024-01-03 06:40:00-07:00,23.0415 +741,2024-01-03 06:45:00-07:00,23.5086 +742,2024-01-03 06:50:00-07:00,24.4455 +743,2024-01-03 06:55:00-07:00,24.0589 +744,2024-01-03 07:00:00-07:00,24.8288 +745,2024-01-03 07:05:00-07:00,25.4271 +746,2024-01-03 07:10:00-07:00,24.2061 +747,2024-01-03 07:15:00-07:00,24.9158 +748,2024-01-03 07:20:00-07:00,25.4206 +749,2024-01-03 07:25:00-07:00,25.0958 +750,2024-01-03 07:30:00-07:00,26.0386 +751,2024-01-03 07:35:00-07:00,25.0968 +752,2024-01-03 07:40:00-07:00,597.5184 +753,2024-01-03 07:45:00-07:00,424.7033 +754,2024-01-03 07:50:00-07:00,25.0875 +755,2024-01-03 07:55:00-07:00,26.9175 +756,2024-01-03 08:00:00-07:00,28.5391 +757,2024-01-03 08:05:00-07:00,650.0418 +758,2024-01-03 08:10:00-07:00,638.355 +759,2024-01-03 08:15:00-07:00,25.0398 +760,2024-01-03 08:20:00-07:00,527.6791 +761,2024-01-03 08:25:00-07:00,23.0756 +762,2024-01-03 08:30:00-07:00,22.94 +763,2024-01-03 08:35:00-07:00,21.9034 +764,2024-01-03 08:40:00-07:00,21.9531 +765,2024-01-03 08:45:00-07:00,20.4556 +766,2024-01-03 08:50:00-07:00,20.0197 +767,2024-01-03 08:55:00-07:00,20.3868 +768,2024-01-03 09:00:00-07:00,20.6152 +769,2024-01-03 09:05:00-07:00,20.7627 +770,2024-01-03 09:10:00-07:00,21.2108 +771,2024-01-03 09:15:00-07:00,21.6631 +772,2024-01-03 09:20:00-07:00,22.9667 +773,2024-01-03 09:25:00-07:00,21.7269 +774,2024-01-03 09:30:00-07:00,21.7283 +775,2024-01-03 09:35:00-07:00,21.6704 +776,2024-01-03 09:40:00-07:00,21.917 +777,2024-01-03 09:45:00-07:00,21.971 +778,2024-01-03 09:50:00-07:00,19.5482 +779,2024-01-03 09:55:00-07:00,18.1017 +780,2024-01-03 10:00:00-07:00,14.6222 +781,2024-01-03 10:05:00-07:00,17.9877 +782,2024-01-03 10:10:00-07:00,20.3138 +783,2024-01-03 10:15:00-07:00,21.0456 +784,2024-01-03 10:20:00-07:00,21.249 +785,2024-01-03 10:25:00-07:00,20.7056 +786,2024-01-03 10:30:00-07:00,21.3446 +787,2024-01-03 10:35:00-07:00,21.2869 +788,2024-01-03 10:40:00-07:00,21.8768 +789,2024-01-03 10:45:00-07:00,22.5844 +790,2024-01-03 10:50:00-07:00,22.2749 +791,2024-01-03 10:55:00-07:00,20.1222 +792,2024-01-03 11:00:00-07:00,20.1691 +793,2024-01-03 11:05:00-07:00,20.1363 +794,2024-01-03 11:10:00-07:00,20.5118 +795,2024-01-03 11:15:00-07:00,20.8513 +796,2024-01-03 11:20:00-07:00,21.0574 +797,2024-01-03 11:25:00-07:00,21.042 +798,2024-01-03 11:30:00-07:00,21.0786 +799,2024-01-03 11:35:00-07:00,21.3473 +800,2024-01-03 11:40:00-07:00,22.1563 +801,2024-01-03 11:45:00-07:00,21.6327 +802,2024-01-03 11:50:00-07:00,21.6183 +803,2024-01-03 11:55:00-07:00,21.5496 +804,2024-01-03 12:00:00-07:00,21.2922 +805,2024-01-03 12:05:00-07:00,20.7837 +806,2024-01-03 12:10:00-07:00,20.7242 +807,2024-01-03 12:15:00-07:00,20.6119 +808,2024-01-03 12:20:00-07:00,20.5855 +809,2024-01-03 12:25:00-07:00,20.4641 +810,2024-01-03 12:30:00-07:00,20.4114 +811,2024-01-03 12:35:00-07:00,20.3383 +812,2024-01-03 12:40:00-07:00,20.1602 +813,2024-01-03 12:45:00-07:00,19.7076 +814,2024-01-03 12:50:00-07:00,18.6923 +815,2024-01-03 12:55:00-07:00,18.6414 +816,2024-01-03 13:00:00-07:00,17.8252 +817,2024-01-03 13:05:00-07:00,17.7069 +818,2024-01-03 13:10:00-07:00,17.7296 +819,2024-01-03 13:15:00-07:00,17.3547 +820,2024-01-03 13:20:00-07:00,17.3024 +821,2024-01-03 13:25:00-07:00,14.5842 +822,2024-01-03 13:30:00-07:00,16.254 +823,2024-01-03 13:35:00-07:00,16.1636 +824,2024-01-03 13:40:00-07:00,16.9652 +825,2024-01-03 13:45:00-07:00,16.8639 +826,2024-01-03 13:50:00-07:00,15.8375 +827,2024-01-03 13:55:00-07:00,16.4447 +828,2024-01-03 14:00:00-07:00,16.6666 +829,2024-01-03 14:05:00-07:00,14.6386 +830,2024-01-03 14:10:00-07:00,16.0317 +831,2024-01-03 14:15:00-07:00,15.8604 +832,2024-01-03 14:20:00-07:00,15.5792 +833,2024-01-03 14:25:00-07:00,14.7488 +834,2024-01-03 14:30:00-07:00,15.2987 +835,2024-01-03 14:35:00-07:00,17.0136 +836,2024-01-03 14:40:00-07:00,17.122 +837,2024-01-03 14:45:00-07:00,20.0187 +838,2024-01-03 14:50:00-07:00,20.3338 +839,2024-01-03 14:55:00-07:00,20.5619 +840,2024-01-03 15:00:00-07:00,20.6305 +841,2024-01-03 15:05:00-07:00,21.5512 +842,2024-01-03 15:10:00-07:00,21.8638 +843,2024-01-03 15:15:00-07:00,20.8227 +844,2024-01-03 15:20:00-07:00,21.0471 +845,2024-01-03 15:25:00-07:00,21.4216 +846,2024-01-03 15:30:00-07:00,21.6758 +847,2024-01-03 15:35:00-07:00,22.4466 +848,2024-01-03 15:40:00-07:00,22.9234 +849,2024-01-03 15:45:00-07:00,24.3794 +850,2024-01-03 15:50:00-07:00,35.5495 +851,2024-01-03 15:55:00-07:00,35.3135 +852,2024-01-03 16:00:00-07:00,680.9031 +853,2024-01-03 16:05:00-07:00,25.3282 +854,2024-01-03 16:10:00-07:00,24.1006 +855,2024-01-03 16:15:00-07:00,23.0643 +856,2024-01-03 16:20:00-07:00,33.2752 +857,2024-01-03 16:25:00-07:00,22.729 +858,2024-01-03 16:30:00-07:00,22.9614 +859,2024-01-03 16:35:00-07:00,23.2747 +860,2024-01-03 16:40:00-07:00,23.6304 +861,2024-01-03 16:45:00-07:00,23.813 +862,2024-01-03 16:50:00-07:00,24.2508 +863,2024-01-03 16:55:00-07:00,26.989 +864,2024-01-03 17:00:00-07:00,25.6469 +865,2024-01-03 17:05:00-07:00,24.6541 +866,2024-01-03 17:10:00-07:00,23.6417 +867,2024-01-03 17:15:00-07:00,23.0994 +868,2024-01-03 17:20:00-07:00,22.2273 +869,2024-01-03 17:25:00-07:00,21.6785 +870,2024-01-03 17:30:00-07:00,21.8029 +871,2024-01-03 17:35:00-07:00,21.651 +872,2024-01-03 17:40:00-07:00,20.6595 +873,2024-01-03 17:45:00-07:00,19.8144 +874,2024-01-03 17:50:00-07:00,18.9563 +875,2024-01-03 17:55:00-07:00,21.1757 +876,2024-01-03 18:00:00-07:00,20.603 +877,2024-01-03 18:05:00-07:00,20.5682 +878,2024-01-03 18:10:00-07:00,19.9589 +879,2024-01-03 18:15:00-07:00,19.1057 +880,2024-01-03 18:20:00-07:00,18.4743 +881,2024-01-03 18:25:00-07:00,17.0715 +882,2024-01-03 18:30:00-07:00,17.0004 +883,2024-01-03 18:35:00-07:00,17.345 +884,2024-01-03 18:40:00-07:00,17.1639 +885,2024-01-03 18:45:00-07:00,16.7677 +886,2024-01-03 18:50:00-07:00,14.8346 +887,2024-01-03 18:55:00-07:00,15.126 +888,2024-01-03 19:00:00-07:00,15.2385 +889,2024-01-03 19:05:00-07:00,14.8521 +890,2024-01-03 19:10:00-07:00,15.0552 +891,2024-01-03 19:15:00-07:00,15.0201 +892,2024-01-03 19:20:00-07:00,15.3331 +893,2024-01-03 19:25:00-07:00,14.9818 +894,2024-01-03 19:30:00-07:00,15.0524 +895,2024-01-03 19:35:00-07:00,18.5455 +896,2024-01-03 19:40:00-07:00,16.285 +897,2024-01-03 19:45:00-07:00,14.7992 +898,2024-01-03 19:50:00-07:00,14.732 +899,2024-01-03 19:55:00-07:00,14.9786 +900,2024-01-03 20:00:00-07:00,19.8676 +901,2024-01-03 20:05:00-07:00,17.0437 +902,2024-01-03 20:10:00-07:00,14.7269 +903,2024-01-03 20:15:00-07:00,14.7802 +904,2024-01-03 20:20:00-07:00,14.7609 +905,2024-01-03 20:25:00-07:00,14.7461 +906,2024-01-03 20:30:00-07:00,21.1752 +907,2024-01-03 20:35:00-07:00,17.2844 +908,2024-01-03 20:40:00-07:00,16.061 +909,2024-01-03 20:45:00-07:00,15.1838 +910,2024-01-03 20:50:00-07:00,15.2085 +911,2024-01-03 20:55:00-07:00,16.877 +912,2024-01-03 21:00:00-07:00,19.7733 +913,2024-01-03 21:05:00-07:00,17.435 +914,2024-01-03 21:10:00-07:00,17.3528 +915,2024-01-03 21:15:00-07:00,16.3142 +916,2024-01-03 21:20:00-07:00,17.1894 +917,2024-01-03 21:25:00-07:00,16.9693 +918,2024-01-03 21:30:00-07:00,16.8409 +919,2024-01-03 21:35:00-07:00,16.6417 +920,2024-01-03 21:40:00-07:00,16.6706 +921,2024-01-03 21:45:00-07:00,16.2423 +922,2024-01-03 21:50:00-07:00,16.0197 +923,2024-01-03 21:55:00-07:00,15.9869 +924,2024-01-03 22:00:00-07:00,0.1737 +925,2024-01-03 22:05:00-07:00,14.2144 +926,2024-01-03 22:10:00-07:00,14.2641 +927,2024-01-03 22:15:00-07:00,14.105 +928,2024-01-03 22:20:00-07:00,14.1527 +929,2024-01-03 22:25:00-07:00,14.179 +930,2024-01-03 22:30:00-07:00,14.1973 +931,2024-01-03 22:35:00-07:00,14.0795 +932,2024-01-03 22:40:00-07:00,13.801 +933,2024-01-03 22:45:00-07:00,13.7493 +934,2024-01-03 22:50:00-07:00,13.6416 +935,2024-01-03 22:55:00-07:00,13.2839 +936,2024-01-03 23:00:00-07:00,13.8203 +937,2024-01-03 23:05:00-07:00,14.1346 +938,2024-01-03 23:10:00-07:00,15.6316 +939,2024-01-03 23:15:00-07:00,15.102 +940,2024-01-03 23:20:00-07:00,15.0156 +941,2024-01-03 23:25:00-07:00,14.8887 +942,2024-01-03 23:30:00-07:00,14.675 +943,2024-01-03 23:35:00-07:00,15.0311 +944,2024-01-03 23:40:00-07:00,15.3724 +945,2024-01-03 23:45:00-07:00,15.41 +946,2024-01-03 23:50:00-07:00,15.2058 +947,2024-01-03 23:55:00-07:00,15.3194 +948,2024-01-04 00:00:00-07:00,15.4328 +949,2024-01-04 00:05:00-07:00,15.4183 +950,2024-01-04 00:10:00-07:00,15.6333 +951,2024-01-04 00:15:00-07:00,15.8828 +952,2024-01-04 00:20:00-07:00,16.1 +953,2024-01-04 00:25:00-07:00,16.1885 +954,2024-01-04 00:30:00-07:00,16.3775 +955,2024-01-04 00:35:00-07:00,16.4546 +956,2024-01-04 00:40:00-07:00,16.4932 +957,2024-01-04 00:45:00-07:00,16.371 +958,2024-01-04 00:50:00-07:00,16.2991 +959,2024-01-04 00:55:00-07:00,16.1817 +960,2024-01-04 01:00:00-07:00,16.2589 +961,2024-01-04 01:05:00-07:00,16.498 +962,2024-01-04 01:10:00-07:00,16.5825 +963,2024-01-04 01:15:00-07:00,16.7398 +964,2024-01-04 01:20:00-07:00,16.8849 +965,2024-01-04 01:25:00-07:00,16.9877 +966,2024-01-04 01:30:00-07:00,16.976 +967,2024-01-04 01:35:00-07:00,17.0903 +968,2024-01-04 01:40:00-07:00,17.1506 +969,2024-01-04 01:45:00-07:00,17.0943 +970,2024-01-04 01:50:00-07:00,17.099 +971,2024-01-04 01:55:00-07:00,18.2358 +972,2024-01-04 02:00:00-07:00,18.2613 +973,2024-01-04 02:05:00-07:00,18.3996 +974,2024-01-04 02:10:00-07:00,18.8343 +975,2024-01-04 02:15:00-07:00,18.9458 +976,2024-01-04 02:20:00-07:00,19.1948 +977,2024-01-04 02:25:00-07:00,19.2181 +978,2024-01-04 02:30:00-07:00,19.2943 +979,2024-01-04 02:35:00-07:00,21.6525 +980,2024-01-04 02:40:00-07:00,20.5491 +981,2024-01-04 02:45:00-07:00,19.5362 +982,2024-01-04 02:50:00-07:00,19.4675 +983,2024-01-04 02:55:00-07:00,19.4778 +984,2024-01-04 03:00:00-07:00,19.6285 +985,2024-01-04 03:05:00-07:00,19.8104 +986,2024-01-04 03:10:00-07:00,20.144 +987,2024-01-04 03:15:00-07:00,21.0475 +988,2024-01-04 03:20:00-07:00,20.6215 +989,2024-01-04 03:25:00-07:00,20.8916 +990,2024-01-04 03:30:00-07:00,21.0357 +991,2024-01-04 03:35:00-07:00,21.627 +992,2024-01-04 03:40:00-07:00,23.0436 +993,2024-01-04 03:45:00-07:00,24.2776 +994,2024-01-04 03:50:00-07:00,24.6785 +995,2024-01-04 03:55:00-07:00,22.9668 +996,2024-01-04 04:00:00-07:00,23.145 +997,2024-01-04 04:05:00-07:00,25.2053 +998,2024-01-04 04:10:00-07:00,39.2502 +999,2024-01-04 04:15:00-07:00,42.1247 +1000,2024-01-04 04:20:00-07:00,39.5836 +1001,2024-01-04 04:25:00-07:00,42.1763 +1002,2024-01-04 04:30:00-07:00,23.779 +1003,2024-01-04 04:35:00-07:00,42.1356 +1004,2024-01-04 04:40:00-07:00,42.073 +1005,2024-01-04 04:45:00-07:00,42.0419 +1006,2024-01-04 04:50:00-07:00,42.0551 +1007,2024-01-04 04:55:00-07:00,42.064 +1008,2024-01-04 05:00:00-07:00,42.0616 +1009,2024-01-04 05:05:00-07:00,41.977 +1010,2024-01-04 05:10:00-07:00,41.9817 +1011,2024-01-04 05:15:00-07:00,38.9768 +1012,2024-01-04 05:20:00-07:00,41.9663 +1013,2024-01-04 05:25:00-07:00,41.9202 +1014,2024-01-04 05:30:00-07:00,41.9063 +1015,2024-01-04 05:35:00-07:00,41.9185 +1016,2024-01-04 05:40:00-07:00,41.8796 +1017,2024-01-04 05:45:00-07:00,41.9261 +1018,2024-01-04 05:50:00-07:00,41.9559 +1019,2024-01-04 05:55:00-07:00,41.9726 +1020,2024-01-04 06:00:00-07:00,45.1069 +1021,2024-01-04 06:05:00-07:00,45.0522 +1022,2024-01-04 06:10:00-07:00,45.0337 +1023,2024-01-04 06:15:00-07:00,45.0382 +1024,2024-01-04 06:20:00-07:00,45.0189 +1025,2024-01-04 06:25:00-07:00,45.004 +1026,2024-01-04 06:30:00-07:00,37.4917 +1027,2024-01-04 06:35:00-07:00,37.4872 +1028,2024-01-04 06:40:00-07:00,37.4337 +1029,2024-01-04 06:45:00-07:00,37.4421 +1030,2024-01-04 06:50:00-07:00,37.4873 +1031,2024-01-04 06:55:00-07:00,45.069 +1032,2024-01-04 07:00:00-07:00,25.6451 +1033,2024-01-04 07:05:00-07:00,44.9203 +1034,2024-01-04 07:10:00-07:00,44.8907 +1035,2024-01-04 07:15:00-07:00,44.9486 +1036,2024-01-04 07:20:00-07:00,44.9496 +1037,2024-01-04 07:25:00-07:00,44.9439 +1038,2024-01-04 07:30:00-07:00,44.9294 +1039,2024-01-04 07:35:00-07:00,44.9392 +1040,2024-01-04 07:40:00-07:00,44.939 +1041,2024-01-04 07:45:00-07:00,44.9654 +1042,2024-01-04 07:50:00-07:00,45.0084 +1043,2024-01-04 07:55:00-07:00,42.5165 +1044,2024-01-04 08:00:00-07:00,36.6262 +1045,2024-01-04 08:05:00-07:00,41.7385 +1046,2024-01-04 08:10:00-07:00,41.4244 +1047,2024-01-04 08:15:00-07:00,33.6679 +1048,2024-01-04 08:20:00-07:00,38.511 +1049,2024-01-04 08:25:00-07:00,34.3844 +1050,2024-01-04 08:30:00-07:00,35.0213 +1051,2024-01-04 08:35:00-07:00,40.603 +1052,2024-01-04 08:40:00-07:00,672.5012 +1053,2024-01-04 08:45:00-07:00,678.7013 +1054,2024-01-04 08:50:00-07:00,40.8187 +1055,2024-01-04 08:55:00-07:00,41.7762 +1056,2024-01-04 09:00:00-07:00,609.3752 +1057,2024-01-04 09:05:00-07:00,334.3491 +1058,2024-01-04 09:10:00-07:00,636.4117 +1059,2024-01-04 09:15:00-07:00,41.8592 +1060,2024-01-04 09:20:00-07:00,41.886 +1061,2024-01-04 09:25:00-07:00,665.2011 +1062,2024-01-04 09:30:00-07:00,41.9392 +1063,2024-01-04 09:35:00-07:00,41.9715 +1064,2024-01-04 09:40:00-07:00,41.969 +1065,2024-01-04 09:45:00-07:00,663.1385 +1066,2024-01-04 09:50:00-07:00,35.0273 +1067,2024-01-04 09:55:00-07:00,25.3625 +1068,2024-01-04 10:00:00-07:00,23.6055 +1069,2024-01-04 10:05:00-07:00,25.0688 +1070,2024-01-04 10:10:00-07:00,581.2746 +1071,2024-01-04 10:15:00-07:00,659.0741 +1072,2024-01-04 10:20:00-07:00,23.716 +1073,2024-01-04 10:25:00-07:00,23.2779 +1074,2024-01-04 10:30:00-07:00,23.5867 +1075,2024-01-04 10:35:00-07:00,24.2906 +1076,2024-01-04 10:40:00-07:00,24.2488 +1077,2024-01-04 10:45:00-07:00,24.5815 +1078,2024-01-04 10:50:00-07:00,23.6879 +1079,2024-01-04 10:55:00-07:00,23.3237 +1080,2024-01-04 11:00:00-07:00,23.405 +1081,2024-01-04 11:05:00-07:00,23.3848 +1082,2024-01-04 11:10:00-07:00,23.4926 +1083,2024-01-04 11:15:00-07:00,23.6379 +1084,2024-01-04 11:20:00-07:00,23.5988 +1085,2024-01-04 11:25:00-07:00,23.3337 +1086,2024-01-04 11:30:00-07:00,23.9736 +1087,2024-01-04 11:35:00-07:00,23.0782 +1088,2024-01-04 11:40:00-07:00,23.0703 +1089,2024-01-04 11:45:00-07:00,22.6508 +1090,2024-01-04 11:50:00-07:00,22.6553 +1091,2024-01-04 11:55:00-07:00,22.2567 +1092,2024-01-04 12:00:00-07:00,22.0937 +1093,2024-01-04 12:05:00-07:00,21.0379 +1094,2024-01-04 12:10:00-07:00,21.3386 +1095,2024-01-04 12:15:00-07:00,20.8237 +1096,2024-01-04 12:20:00-07:00,21.4919 +1097,2024-01-04 12:25:00-07:00,21.2899 +1098,2024-01-04 12:30:00-07:00,21.3969 +1099,2024-01-04 12:35:00-07:00,21.2105 +1100,2024-01-04 12:40:00-07:00,20.7092 +1101,2024-01-04 12:45:00-07:00,21.079 +1102,2024-01-04 12:50:00-07:00,21.1874 +1103,2024-01-04 12:55:00-07:00,21.4057 +1104,2024-01-04 13:00:00-07:00,21.6201 +1105,2024-01-04 13:05:00-07:00,21.0568 +1106,2024-01-04 13:10:00-07:00,20.3283 +1107,2024-01-04 13:15:00-07:00,20.9948 +1108,2024-01-04 13:20:00-07:00,21.0248 +1109,2024-01-04 13:25:00-07:00,18.8424 +1110,2024-01-04 13:30:00-07:00,18.2386 +1111,2024-01-04 13:35:00-07:00,17.9752 +1112,2024-01-04 13:40:00-07:00,18.8233 +1113,2024-01-04 13:45:00-07:00,19.6801 +1114,2024-01-04 13:50:00-07:00,20.3146 +1115,2024-01-04 13:55:00-07:00,20.1679 +1116,2024-01-04 14:00:00-07:00,20.5596 +1117,2024-01-04 14:05:00-07:00,20.6043 +1118,2024-01-04 14:10:00-07:00,21.8112 +1119,2024-01-04 14:15:00-07:00,21.9536 +1120,2024-01-04 14:20:00-07:00,22.1386 +1121,2024-01-04 14:25:00-07:00,22.2454 +1122,2024-01-04 14:30:00-07:00,22.4071 +1123,2024-01-04 14:35:00-07:00,22.5116 +1124,2024-01-04 14:40:00-07:00,22.6903 +1125,2024-01-04 14:45:00-07:00,23.2136 +1126,2024-01-04 14:50:00-07:00,23.2929 +1127,2024-01-04 14:55:00-07:00,23.3109 +1128,2024-01-04 15:00:00-07:00,22.6342 +1129,2024-01-04 15:05:00-07:00,22.4784 +1130,2024-01-04 15:10:00-07:00,22.0071 +1131,2024-01-04 15:15:00-07:00,17.4847 +1132,2024-01-04 15:20:00-07:00,16.5937 +1133,2024-01-04 15:25:00-07:00,22.3432 +1134,2024-01-04 15:30:00-07:00,22.1732 +1135,2024-01-04 15:35:00-07:00,22.1863 +1136,2024-01-04 15:40:00-07:00,22.2313 +1137,2024-01-04 15:45:00-07:00,22.4227 +1138,2024-01-04 15:50:00-07:00,22.5082 +1139,2024-01-04 15:55:00-07:00,22.4832 +1140,2024-01-04 16:00:00-07:00,22.3925 +1141,2024-01-04 16:05:00-07:00,22.3265 +1142,2024-01-04 16:10:00-07:00,22.1804 +1143,2024-01-04 16:15:00-07:00,22.2031 +1144,2024-01-04 16:20:00-07:00,22.5014 +1145,2024-01-04 16:25:00-07:00,23.4951 +1146,2024-01-04 16:30:00-07:00,24.0444 +1147,2024-01-04 16:35:00-07:00,25.6206 +1148,2024-01-04 16:40:00-07:00,31.5987 +1149,2024-01-04 16:45:00-07:00,32.9321 +1150,2024-01-04 16:50:00-07:00,34.7416 +1151,2024-01-04 16:55:00-07:00,36.9112 +1152,2024-01-04 17:00:00-07:00,38.6576 +1153,2024-01-04 17:05:00-07:00,34.4501 +1154,2024-01-04 17:10:00-07:00,28.6163 +1155,2024-01-04 17:15:00-07:00,25.7588 +1156,2024-01-04 17:20:00-07:00,26.0901 +1157,2024-01-04 17:25:00-07:00,30.3463 +1158,2024-01-04 17:30:00-07:00,32.4004 +1159,2024-01-04 17:35:00-07:00,32.5788 +1160,2024-01-04 17:40:00-07:00,32.726 +1161,2024-01-04 17:45:00-07:00,30.9226 +1162,2024-01-04 17:50:00-07:00,32.0687 +1163,2024-01-04 17:55:00-07:00,30.5096 +1164,2024-01-04 18:00:00-07:00,25.6731 +1165,2024-01-04 18:05:00-07:00,25.8343 +1166,2024-01-04 18:10:00-07:00,25.6185 +1167,2024-01-04 18:15:00-07:00,25.5261 +1168,2024-01-04 18:20:00-07:00,25.1282 +1169,2024-01-04 18:25:00-07:00,24.6715 +1170,2024-01-04 18:30:00-07:00,24.5202 +1171,2024-01-04 18:35:00-07:00,24.075 +1172,2024-01-04 18:40:00-07:00,24.0511 +1173,2024-01-04 18:45:00-07:00,24.0333 +1174,2024-01-04 18:50:00-07:00,24.035 +1175,2024-01-04 18:55:00-07:00,23.9866 +1176,2024-01-04 19:00:00-07:00,24.0432 +1177,2024-01-04 19:05:00-07:00,24.083 +1178,2024-01-04 19:10:00-07:00,24.1386 +1179,2024-01-04 19:15:00-07:00,24.2503 +1180,2024-01-04 19:20:00-07:00,24.3888 +1181,2024-01-04 19:25:00-07:00,24.4437 +1182,2024-01-04 19:30:00-07:00,24.5387 +1183,2024-01-04 19:35:00-07:00,24.8988 +1184,2024-01-04 19:40:00-07:00,25.3341 +1185,2024-01-04 19:45:00-07:00,25.2454 +1186,2024-01-04 19:50:00-07:00,24.6622 +1187,2024-01-04 19:55:00-07:00,32.4433 +1188,2024-01-04 20:00:00-07:00,26.7604 +1189,2024-01-04 20:05:00-07:00,31.9217 +1190,2024-01-04 20:10:00-07:00,31.471 +1191,2024-01-04 20:15:00-07:00,30.7525 +1192,2024-01-04 20:20:00-07:00,29.0789 +1193,2024-01-04 20:25:00-07:00,28.1184 +1194,2024-01-04 20:30:00-07:00,28.1582 +1195,2024-01-04 20:35:00-07:00,30.4686 +1196,2024-01-04 20:40:00-07:00,30.4305 +1197,2024-01-04 20:45:00-07:00,30.4687 +1198,2024-01-04 20:50:00-07:00,30.6399 +1199,2024-01-04 20:55:00-07:00,27.8305 +1200,2024-01-04 21:00:00-07:00,25.7413 +1201,2024-01-04 21:05:00-07:00,26.9469 +1202,2024-01-04 21:10:00-07:00,24.2172 +1203,2024-01-04 21:15:00-07:00,24.2107 +1204,2024-01-04 21:20:00-07:00,24.0509 +1205,2024-01-04 21:25:00-07:00,24.0094 +1206,2024-01-04 21:30:00-07:00,23.4681 +1207,2024-01-04 21:35:00-07:00,23.2406 +1208,2024-01-04 21:40:00-07:00,22.7947 +1209,2024-01-04 21:45:00-07:00,22.7056 +1210,2024-01-04 21:50:00-07:00,22.5144 +1211,2024-01-04 21:55:00-07:00,22.5024 +1212,2024-01-04 22:00:00-07:00,22.4965 +1213,2024-01-04 22:05:00-07:00,22.49 +1214,2024-01-04 22:10:00-07:00,22.7059 +1215,2024-01-04 22:15:00-07:00,22.7115 +1216,2024-01-04 22:20:00-07:00,22.6703 +1217,2024-01-04 22:25:00-07:00,22.6617 +1218,2024-01-04 22:30:00-07:00,22.8195 +1219,2024-01-04 22:35:00-07:00,22.7795 +1220,2024-01-04 22:40:00-07:00,23.3247 +1221,2024-01-04 22:45:00-07:00,24.3041 +1222,2024-01-04 22:50:00-07:00,31.434 +1223,2024-01-04 22:55:00-07:00,25.8046 +1224,2024-01-04 23:00:00-07:00,669.8209 +1225,2024-01-04 23:05:00-07:00,27.3372 +1226,2024-01-04 23:10:00-07:00,26.7676 +1227,2024-01-04 23:15:00-07:00,30.3901 +1228,2024-01-04 23:20:00-07:00,32.9284 +1229,2024-01-04 23:25:00-07:00,31.1732 +1230,2024-01-04 23:30:00-07:00,580.6514 +1231,2024-01-04 23:35:00-07:00,31.4153 +1232,2024-01-04 23:40:00-07:00,30.62 +1233,2024-01-04 23:45:00-07:00,26.3152 +1234,2024-01-04 23:50:00-07:00,25.522 +1235,2024-01-04 23:55:00-07:00,24.9624 +1236,2024-01-05 00:00:00-07:00,24.624 +1237,2024-01-05 00:05:00-07:00,25.4066 +1238,2024-01-05 00:10:00-07:00,25.3018 +1239,2024-01-05 00:15:00-07:00,25.4514 +1240,2024-01-05 00:20:00-07:00,24.731 +1241,2024-01-05 00:25:00-07:00,28.8359 +1242,2024-01-05 00:30:00-07:00,25.4925 +1243,2024-01-05 00:35:00-07:00,25.8143 +1244,2024-01-05 00:40:00-07:00,25.0884 +1245,2024-01-05 00:45:00-07:00,25.3121 +1246,2024-01-05 00:50:00-07:00,24.6866 +1247,2024-01-05 00:55:00-07:00,24.4731 +1248,2024-01-05 01:00:00-07:00,25.2132 +1249,2024-01-05 01:05:00-07:00,25.268 +1250,2024-01-05 01:10:00-07:00,25.1596 +1251,2024-01-05 01:15:00-07:00,25.3867 +1252,2024-01-05 01:20:00-07:00,25.169 +1253,2024-01-05 01:25:00-07:00,24.63 +1254,2024-01-05 01:30:00-07:00,24.3508 +1255,2024-01-05 01:35:00-07:00,24.2473 +1256,2024-01-05 01:40:00-07:00,24.2023 +1257,2024-01-05 01:45:00-07:00,24.1559 +1258,2024-01-05 01:50:00-07:00,24.1857 +1259,2024-01-05 01:55:00-07:00,24.1598 +1260,2024-01-05 02:00:00-07:00,23.7902 +1261,2024-01-05 02:05:00-07:00,23.985 +1262,2024-01-05 02:10:00-07:00,23.9946 +1263,2024-01-05 02:15:00-07:00,23.9848 +1264,2024-01-05 02:20:00-07:00,23.9588 +1265,2024-01-05 02:25:00-07:00,23.9596 +1266,2024-01-05 02:30:00-07:00,23.9587 +1267,2024-01-05 02:35:00-07:00,23.9108 +1268,2024-01-05 02:40:00-07:00,23.8906 +1269,2024-01-05 02:45:00-07:00,23.7816 +1270,2024-01-05 02:50:00-07:00,23.6808 +1271,2024-01-05 02:55:00-07:00,23.3779 +1272,2024-01-05 03:00:00-07:00,23.3428 +1273,2024-01-05 03:05:00-07:00,23.2242 +1274,2024-01-05 03:10:00-07:00,23.1331 +1275,2024-01-05 03:15:00-07:00,22.8717 +1276,2024-01-05 03:20:00-07:00,22.7796 +1277,2024-01-05 03:25:00-07:00,22.6504 +1278,2024-01-05 03:30:00-07:00,22.6303 +1279,2024-01-05 03:35:00-07:00,22.4995 +1280,2024-01-05 03:40:00-07:00,22.4055 +1281,2024-01-05 03:45:00-07:00,21.8819 +1282,2024-01-05 03:50:00-07:00,21.0115 +1283,2024-01-05 03:55:00-07:00,20.9645 +1284,2024-01-05 04:00:00-07:00,21.0425 +1285,2024-01-05 04:05:00-07:00,20.1619 +1286,2024-01-05 04:10:00-07:00,19.8355 +1287,2024-01-05 04:15:00-07:00,19.2827 +1288,2024-01-05 04:20:00-07:00,19.9945 +1289,2024-01-05 04:25:00-07:00,19.4675 +1290,2024-01-05 04:30:00-07:00,19.4185 +1291,2024-01-05 04:35:00-07:00,25.3833 +1292,2024-01-05 04:40:00-07:00,23.4413 +1293,2024-01-05 04:45:00-07:00,26.0999 +1294,2024-01-05 04:50:00-07:00,20.346 +1295,2024-01-05 04:55:00-07:00,20.4854 +1296,2024-01-05 05:00:00-07:00,19.2206 +1297,2024-01-05 05:05:00-07:00,31.6691 +1298,2024-01-05 05:10:00-07:00,18.9046 +1299,2024-01-05 05:15:00-07:00,16.321 +1300,2024-01-05 05:20:00-07:00,0.1288 +1301,2024-01-05 05:25:00-07:00,15.8124 +1302,2024-01-05 05:30:00-07:00,16.7937 +1303,2024-01-05 05:35:00-07:00,16.5371 +1304,2024-01-05 05:40:00-07:00,16.9206 +1305,2024-01-05 05:45:00-07:00,16.9742 +1306,2024-01-05 05:50:00-07:00,17.3315 +1307,2024-01-05 05:55:00-07:00,28.3566 +1308,2024-01-05 06:00:00-07:00,22.2398 +1309,2024-01-05 06:05:00-07:00,21.6093 +1310,2024-01-05 06:10:00-07:00,19.464 +1311,2024-01-05 06:15:00-07:00,24.6785 +1312,2024-01-05 06:20:00-07:00,30.2455 +1313,2024-01-05 06:25:00-07:00,23.137 +1314,2024-01-05 06:30:00-07:00,20.7391 +1315,2024-01-05 06:35:00-07:00,22.2374 +1316,2024-01-05 06:40:00-07:00,22.1928 +1317,2024-01-05 06:45:00-07:00,22.2867 +1318,2024-01-05 06:50:00-07:00,22.4062 +1319,2024-01-05 06:55:00-07:00,22.4298 +1320,2024-01-05 07:00:00-07:00,21.5193 +1321,2024-01-05 07:05:00-07:00,22.0353 +1322,2024-01-05 07:10:00-07:00,21.986 +1323,2024-01-05 07:15:00-07:00,21.9923 +1324,2024-01-05 07:20:00-07:00,21.03 +1325,2024-01-05 07:25:00-07:00,21.9021 +1326,2024-01-05 07:30:00-07:00,21.0161 +1327,2024-01-05 07:35:00-07:00,21.6539 +1328,2024-01-05 07:40:00-07:00,21.845 +1329,2024-01-05 07:45:00-07:00,21.0913 +1330,2024-01-05 07:50:00-07:00,21.0454 +1331,2024-01-05 07:55:00-07:00,20.7774 +1332,2024-01-05 08:00:00-07:00,22.0344 +1333,2024-01-05 08:05:00-07:00,22.1365 +1334,2024-01-05 08:10:00-07:00,23.1121 +1335,2024-01-05 08:15:00-07:00,22.4411 +1336,2024-01-05 08:20:00-07:00,21.9043 +1337,2024-01-05 08:25:00-07:00,20.8351 +1338,2024-01-05 08:30:00-07:00,19.2868 +1339,2024-01-05 08:35:00-07:00,19.0937 +1340,2024-01-05 08:40:00-07:00,18.2434 +1341,2024-01-05 08:45:00-07:00,17.3225 +1342,2024-01-05 08:50:00-07:00,18.0232 +1343,2024-01-05 08:55:00-07:00,18.5435 +1344,2024-01-05 09:00:00-07:00,22.2547 +1345,2024-01-05 09:05:00-07:00,21.4465 +1346,2024-01-05 09:10:00-07:00,20.9301 +1347,2024-01-05 09:15:00-07:00,20.9244 +1348,2024-01-05 09:20:00-07:00,20.9415 +1349,2024-01-05 09:25:00-07:00,21.935 +1350,2024-01-05 09:30:00-07:00,21.95 +1351,2024-01-05 09:35:00-07:00,21.493 +1352,2024-01-05 09:40:00-07:00,21.2041 +1353,2024-01-05 09:45:00-07:00,20.5733 +1354,2024-01-05 09:50:00-07:00,18.2744 +1355,2024-01-05 09:55:00-07:00,18.8737 +1356,2024-01-05 10:00:00-07:00,18.6971 +1357,2024-01-05 10:05:00-07:00,18.0114 +1358,2024-01-05 10:10:00-07:00,16.9626 +1359,2024-01-05 10:15:00-07:00,19.6 +1360,2024-01-05 10:20:00-07:00,19.5838 +1361,2024-01-05 10:25:00-07:00,19.6186 +1362,2024-01-05 10:30:00-07:00,20.0483 +1363,2024-01-05 10:35:00-07:00,19.2409 +1364,2024-01-05 10:40:00-07:00,19.009 +1365,2024-01-05 10:45:00-07:00,19.2799 +1366,2024-01-05 10:50:00-07:00,19.1758 +1367,2024-01-05 10:55:00-07:00,19.2137 +1368,2024-01-05 11:00:00-07:00,19.4121 +1369,2024-01-05 11:05:00-07:00,20.4089 +1370,2024-01-05 11:10:00-07:00,19.6107 +1371,2024-01-05 11:15:00-07:00,22.9618 +1372,2024-01-05 11:20:00-07:00,22.2045 +1373,2024-01-05 11:25:00-07:00,21.9137 +1374,2024-01-05 11:30:00-07:00,21.6077 +1375,2024-01-05 11:35:00-07:00,20.9204 +1376,2024-01-05 11:40:00-07:00,20.255 +1377,2024-01-05 11:45:00-07:00,18.8653 +1378,2024-01-05 11:50:00-07:00,18.7262 +1379,2024-01-05 11:55:00-07:00,18.4701 +1380,2024-01-05 12:00:00-07:00,18.8089 +1381,2024-01-05 12:05:00-07:00,18.5824 +1382,2024-01-05 12:10:00-07:00,17.8051 +1383,2024-01-05 12:15:00-07:00,18.1547 +1384,2024-01-05 12:20:00-07:00,18.1334 +1385,2024-01-05 12:25:00-07:00,17.8407 +1386,2024-01-05 12:30:00-07:00,17.777 +1387,2024-01-05 12:35:00-07:00,18.0261 +1388,2024-01-05 12:40:00-07:00,17.3829 +1389,2024-01-05 12:45:00-07:00,17.3351 +1390,2024-01-05 12:50:00-07:00,22.924 +1391,2024-01-05 12:55:00-07:00,23.1164 +1392,2024-01-05 13:00:00-07:00,24.0429 +1393,2024-01-05 13:05:00-07:00,23.7099 +1394,2024-01-05 13:10:00-07:00,23.1534 +1395,2024-01-05 13:15:00-07:00,23.2541 +1396,2024-01-05 13:20:00-07:00,23.5489 +1397,2024-01-05 13:25:00-07:00,23.6986 +1398,2024-01-05 13:30:00-07:00,23.6758 +1399,2024-01-05 13:35:00-07:00,23.8749 +1400,2024-01-05 13:40:00-07:00,23.3922 +1401,2024-01-05 13:45:00-07:00,23.5274 +1402,2024-01-05 13:50:00-07:00,23.2984 +1403,2024-01-05 13:55:00-07:00,23.0149 +1404,2024-01-05 14:00:00-07:00,23.4149 +1405,2024-01-05 14:05:00-07:00,22.311 +1406,2024-01-05 14:10:00-07:00,22.9114 +1407,2024-01-05 14:15:00-07:00,21.3038 +1408,2024-01-05 14:20:00-07:00,21.6002 +1409,2024-01-05 14:25:00-07:00,21.1775 +1410,2024-01-05 14:30:00-07:00,20.9846 +1411,2024-01-05 14:35:00-07:00,20.9542 +1412,2024-01-05 14:40:00-07:00,21.6895 +1413,2024-01-05 14:45:00-07:00,22.5674 +1414,2024-01-05 14:50:00-07:00,23.2922 +1415,2024-01-05 14:55:00-07:00,22.8669 +1416,2024-01-05 15:00:00-07:00,23.623 +1417,2024-01-05 15:05:00-07:00,23.8056 +1418,2024-01-05 15:10:00-07:00,23.64 +1419,2024-01-05 15:15:00-07:00,24.1361 +1420,2024-01-05 15:20:00-07:00,21.4956 +1421,2024-01-05 15:25:00-07:00,24.9865 +1422,2024-01-05 15:30:00-07:00,26.9459 +1423,2024-01-05 15:35:00-07:00,25.8124 +1424,2024-01-05 15:40:00-07:00,23.4654 +1425,2024-01-05 15:45:00-07:00,24.905 +1426,2024-01-05 15:50:00-07:00,27.5848 +1427,2024-01-05 15:55:00-07:00,25.7359 +1428,2024-01-05 16:00:00-07:00,25.9859 +1429,2024-01-05 16:05:00-07:00,28.056 +1430,2024-01-05 16:10:00-07:00,26.5044 +1431,2024-01-05 16:15:00-07:00,24.772 +1432,2024-01-05 16:20:00-07:00,28.1468 +1433,2024-01-05 16:25:00-07:00,27.518 +1434,2024-01-05 16:30:00-07:00,27.2055 +1435,2024-01-05 16:35:00-07:00,26.4241 +1436,2024-01-05 16:40:00-07:00,25.8828 +1437,2024-01-05 16:45:00-07:00,24.6579 +1438,2024-01-05 16:50:00-07:00,24.8869 +1439,2024-01-05 16:55:00-07:00,24.1413 +1440,2024-01-05 17:00:00-07:00,23.9358 +1441,2024-01-05 17:05:00-07:00,24.0663 +1442,2024-01-05 17:10:00-07:00,23.4528 +1443,2024-01-05 17:15:00-07:00,23.3489 +1444,2024-01-05 17:20:00-07:00,23.4159 +1445,2024-01-05 17:25:00-07:00,23.393 +1446,2024-01-05 17:30:00-07:00,23.4032 +1447,2024-01-05 17:35:00-07:00,23.324 +1448,2024-01-05 17:40:00-07:00,23.268 +1449,2024-01-05 17:45:00-07:00,23.1425 +1450,2024-01-05 17:50:00-07:00,22.6736 +1451,2024-01-05 17:55:00-07:00,22.4909 +1452,2024-01-05 18:00:00-07:00,22.6725 +1453,2024-01-05 18:05:00-07:00,22.3898 +1454,2024-01-05 18:10:00-07:00,22.1879 +1455,2024-01-05 18:15:00-07:00,22.1526 +1456,2024-01-05 18:20:00-07:00,21.9732 +1457,2024-01-05 18:25:00-07:00,21.7794 +1458,2024-01-05 18:30:00-07:00,22.1493 +1459,2024-01-05 18:35:00-07:00,22.35 +1460,2024-01-05 18:40:00-07:00,22.1952 +1461,2024-01-05 18:45:00-07:00,21.9493 +1462,2024-01-05 18:50:00-07:00,21.5078 +1463,2024-01-05 18:55:00-07:00,22.3983 +1464,2024-01-05 19:00:00-07:00,22.2506 +1465,2024-01-05 19:05:00-07:00,22.4044 +1466,2024-01-05 19:10:00-07:00,22.4087 +1467,2024-01-05 19:15:00-07:00,22.3697 +1468,2024-01-05 19:20:00-07:00,21.7281 +1469,2024-01-05 19:25:00-07:00,21.83 +1470,2024-01-05 19:30:00-07:00,22.0322 +1471,2024-01-05 19:35:00-07:00,21.7232 +1472,2024-01-05 19:40:00-07:00,21.5421 +1473,2024-01-05 19:45:00-07:00,20.247 +1474,2024-01-05 19:50:00-07:00,18.7695 +1475,2024-01-05 19:55:00-07:00,19.4807 +1476,2024-01-05 20:00:00-07:00,23.0321 +1477,2024-01-05 20:05:00-07:00,22.3932 +1478,2024-01-05 20:10:00-07:00,22.4499 +1479,2024-01-05 20:15:00-07:00,21.6448 +1480,2024-01-05 20:20:00-07:00,20.8215 +1481,2024-01-05 20:25:00-07:00,19.3935 +1482,2024-01-05 20:30:00-07:00,17.8508 +1483,2024-01-05 20:35:00-07:00,17.4609 +1484,2024-01-05 20:40:00-07:00,17.4199 +1485,2024-01-05 20:45:00-07:00,16.0241 +1486,2024-01-05 20:50:00-07:00,0.1759 +1487,2024-01-05 20:55:00-07:00,10.32 +1488,2024-01-05 21:00:00-07:00,14.8686 +1489,2024-01-05 21:05:00-07:00,0.1765 +1490,2024-01-05 21:10:00-07:00,0.1764 +1491,2024-01-05 21:15:00-07:00,14.5821 +1492,2024-01-05 21:20:00-07:00,13.9791 +1493,2024-01-05 21:25:00-07:00,0.1754 +1494,2024-01-05 21:30:00-07:00,15.8098 +1495,2024-01-05 21:35:00-07:00,17.7265 +1496,2024-01-05 21:40:00-07:00,16.9115 +1497,2024-01-05 21:45:00-07:00,17.3176 +1498,2024-01-05 21:50:00-07:00,17.3188 +1499,2024-01-05 21:55:00-07:00,17.2849 +1500,2024-01-05 22:00:00-07:00,17.8781 +1501,2024-01-05 22:05:00-07:00,17.4865 +1502,2024-01-05 22:10:00-07:00,17.4576 +1503,2024-01-05 22:15:00-07:00,17.3067 +1504,2024-01-05 22:20:00-07:00,16.9867 +1505,2024-01-05 22:25:00-07:00,16.8634 +1506,2024-01-05 22:30:00-07:00,16.8489 +1507,2024-01-05 22:35:00-07:00,16.8477 +1508,2024-01-05 22:40:00-07:00,17.077 +1509,2024-01-05 22:45:00-07:00,17.2462 +1510,2024-01-05 22:50:00-07:00,17.3798 +1511,2024-01-05 22:55:00-07:00,17.1961 +1512,2024-01-05 23:00:00-07:00,17.364 +1513,2024-01-05 23:05:00-07:00,17.4961 +1514,2024-01-05 23:10:00-07:00,18.146 +1515,2024-01-05 23:15:00-07:00,20.8809 +1516,2024-01-05 23:20:00-07:00,20.342 +1517,2024-01-05 23:25:00-07:00,17.1797 +1518,2024-01-05 23:30:00-07:00,17.2121 +1519,2024-01-05 23:35:00-07:00,17.2368 +1520,2024-01-05 23:40:00-07:00,17.2639 +1521,2024-01-05 23:45:00-07:00,17.1062 +1522,2024-01-05 23:50:00-07:00,16.7596 +1523,2024-01-05 23:55:00-07:00,16.3786 +1524,2024-01-06 00:00:00-07:00,16.12 +1525,2024-01-06 00:05:00-07:00,15.7939 +1526,2024-01-06 00:10:00-07:00,17.2279 +1527,2024-01-06 00:15:00-07:00,15.955 +1528,2024-01-06 00:20:00-07:00,15.9622 +1529,2024-01-06 00:25:00-07:00,15.736 +1530,2024-01-06 00:30:00-07:00,14.0103 +1531,2024-01-06 00:35:00-07:00,14.3664 +1532,2024-01-06 00:40:00-07:00,14.1484 +1533,2024-01-06 00:45:00-07:00,13.9277 +1534,2024-01-06 00:50:00-07:00,1.8569 +1535,2024-01-06 00:55:00-07:00,1.8679 +1536,2024-01-06 01:00:00-07:00,2.647 +1537,2024-01-06 01:05:00-07:00,2.1348 +1538,2024-01-06 01:10:00-07:00,3.0348 +1539,2024-01-06 01:15:00-07:00,2.5979 +1540,2024-01-06 01:20:00-07:00,2.7266 +1541,2024-01-06 01:25:00-07:00,1.933 +1542,2024-01-06 01:30:00-07:00,2.6934 +1543,2024-01-06 01:35:00-07:00,8.5561 +1544,2024-01-06 01:40:00-07:00,16.527 +1545,2024-01-06 01:45:00-07:00,15.1044 +1546,2024-01-06 01:50:00-07:00,14.069 +1547,2024-01-06 01:55:00-07:00,13.5024 +1548,2024-01-06 02:00:00-07:00,14.1531 +1549,2024-01-06 02:05:00-07:00,18.6958 +1550,2024-01-06 02:10:00-07:00,17.8785 +1551,2024-01-06 02:15:00-07:00,16.2693 +1552,2024-01-06 02:20:00-07:00,16.6532 +1553,2024-01-06 02:25:00-07:00,16.388 +1554,2024-01-06 02:30:00-07:00,16.2717 +1555,2024-01-06 02:35:00-07:00,16.457 +1556,2024-01-06 02:40:00-07:00,15.9014 +1557,2024-01-06 02:45:00-07:00,15.8383 +1558,2024-01-06 02:50:00-07:00,15.9378 +1559,2024-01-06 02:55:00-07:00,15.6473 +1560,2024-01-06 03:00:00-07:00,14.8291 +1561,2024-01-06 03:05:00-07:00,14.4659 +1562,2024-01-06 03:10:00-07:00,14.6769 +1563,2024-01-06 03:15:00-07:00,2.2651 +1564,2024-01-06 03:20:00-07:00,1.7577 +1565,2024-01-06 03:25:00-07:00,1.9609 +1566,2024-01-06 03:30:00-07:00,12.9266 +1567,2024-01-06 03:35:00-07:00,12.6644 +1568,2024-01-06 03:40:00-07:00,0.1705 +1569,2024-01-06 03:45:00-07:00,0.171 +1570,2024-01-06 03:50:00-07:00,11.8261 +1571,2024-01-06 03:55:00-07:00,11.6352 +1572,2024-01-06 04:00:00-07:00,0.168 +1573,2024-01-06 04:05:00-07:00,0.1675 +1574,2024-01-06 04:10:00-07:00,-0.9957 +1575,2024-01-06 04:15:00-07:00,0.163 +1576,2024-01-06 04:20:00-07:00,0.1629 +1577,2024-01-06 04:25:00-07:00,0.1634 +1578,2024-01-06 04:30:00-07:00,0.1667 +1579,2024-01-06 04:35:00-07:00,12.9296 +1580,2024-01-06 04:40:00-07:00,12.797 +1581,2024-01-06 04:45:00-07:00,9.3364 +1582,2024-01-06 04:50:00-07:00,12.8128 +1583,2024-01-06 04:55:00-07:00,13.4689 +1584,2024-01-06 05:00:00-07:00,14.1233 +1585,2024-01-06 05:05:00-07:00,14.19 +1586,2024-01-06 05:10:00-07:00,14.0236 +1587,2024-01-06 05:15:00-07:00,13.375 +1588,2024-01-06 05:20:00-07:00,12.97 +1589,2024-01-06 05:25:00-07:00,-37.9631 +1590,2024-01-06 05:30:00-07:00,0.165 +1591,2024-01-06 05:35:00-07:00,13.1366 +1592,2024-01-06 05:40:00-07:00,12.6428 +1593,2024-01-06 05:45:00-07:00,12.5165 +1594,2024-01-06 05:50:00-07:00,13.6864 +1595,2024-01-06 05:55:00-07:00,9.738 +1596,2024-01-06 06:00:00-07:00,0.1614 +1597,2024-01-06 06:05:00-07:00,0.1619 +1598,2024-01-06 06:10:00-07:00,0.1657 +1599,2024-01-06 06:15:00-07:00,0.1634 +1600,2024-01-06 06:20:00-07:00,12.7246 +1601,2024-01-06 06:25:00-07:00,14.0191 +1602,2024-01-06 06:30:00-07:00,10.0307 +1603,2024-01-06 06:35:00-07:00,13.2789 +1604,2024-01-06 06:40:00-07:00,10.2446 +1605,2024-01-06 06:45:00-07:00,13.6338 +1606,2024-01-06 06:50:00-07:00,12.851 +1607,2024-01-06 06:55:00-07:00,14.7407 +1608,2024-01-06 07:00:00-07:00,14.9358 +1609,2024-01-06 07:05:00-07:00,15.1707 +1610,2024-01-06 07:10:00-07:00,14.3084 +1611,2024-01-06 07:15:00-07:00,14.494 +1612,2024-01-06 07:20:00-07:00,14.2219 +1613,2024-01-06 07:25:00-07:00,14.3646 +1614,2024-01-06 07:30:00-07:00,26.4008 +1615,2024-01-06 07:35:00-07:00,25.5824 +1616,2024-01-06 07:40:00-07:00,23.9468 +1617,2024-01-06 07:45:00-07:00,19.9546 +1618,2024-01-06 07:50:00-07:00,14.1305 +1619,2024-01-06 07:55:00-07:00,14.3597 +1620,2024-01-06 08:00:00-07:00,14.3909 +1621,2024-01-06 08:05:00-07:00,14.3492 +1622,2024-01-06 08:10:00-07:00,28.5526 +1623,2024-01-06 08:15:00-07:00,14.6439 +1624,2024-01-06 08:20:00-07:00,14.3794 +1625,2024-01-06 08:25:00-07:00,14.0318 +1626,2024-01-06 08:30:00-07:00,14.3787 +1627,2024-01-06 08:35:00-07:00,14.4245 +1628,2024-01-06 08:40:00-07:00,14.2043 +1629,2024-01-06 08:45:00-07:00,14.0424 +1630,2024-01-06 08:50:00-07:00,13.6879 +1631,2024-01-06 08:55:00-07:00,0.1635 +1632,2024-01-06 09:00:00-07:00,13.912 +1633,2024-01-06 09:05:00-07:00,0.2381 +1634,2024-01-06 09:10:00-07:00,0.1677 +1635,2024-01-06 09:15:00-07:00,0.1719 +1636,2024-01-06 09:20:00-07:00,10.2694 +1637,2024-01-06 09:25:00-07:00,10.19 +1638,2024-01-06 09:30:00-07:00,10.0744 +1639,2024-01-06 09:35:00-07:00,0.1647 +1640,2024-01-06 09:40:00-07:00,0.165 +1641,2024-01-06 09:45:00-07:00,10.9637 +1642,2024-01-06 09:50:00-07:00,0.1663 +1643,2024-01-06 09:55:00-07:00,0.1654 +1644,2024-01-06 10:00:00-07:00,9.6504 +1645,2024-01-06 10:05:00-07:00,12.8058 +1646,2024-01-06 10:10:00-07:00,0.1711 +1647,2024-01-06 10:15:00-07:00,0.178 +1648,2024-01-06 10:20:00-07:00,12.8227 +1649,2024-01-06 10:25:00-07:00,0.1745 +1650,2024-01-06 10:30:00-07:00,13.5877 +1651,2024-01-06 10:35:00-07:00,12.562 +1652,2024-01-06 10:40:00-07:00,13.2046 +1653,2024-01-06 10:45:00-07:00,13.139 +1654,2024-01-06 10:50:00-07:00,14.4531 +1655,2024-01-06 10:55:00-07:00,13.0759 +1656,2024-01-06 11:00:00-07:00,0.0046 +1657,2024-01-06 11:05:00-07:00,0.1746 +1658,2024-01-06 11:10:00-07:00,0.1755 +1659,2024-01-06 11:15:00-07:00,0.1759 +1660,2024-01-06 11:20:00-07:00,0.1775 +1661,2024-01-06 11:25:00-07:00,0.1785 +1662,2024-01-06 11:30:00-07:00,0.1816 +1663,2024-01-06 11:35:00-07:00,11.8819 +1664,2024-01-06 11:40:00-07:00,9.5959 +1665,2024-01-06 11:45:00-07:00,12.9368 +1666,2024-01-06 11:50:00-07:00,12.3167 +1667,2024-01-06 11:55:00-07:00,12.327 +1668,2024-01-06 12:00:00-07:00,13.1878 +1669,2024-01-06 12:05:00-07:00,13.0679 +1670,2024-01-06 12:10:00-07:00,13.3311 +1671,2024-01-06 12:15:00-07:00,13.7083 +1672,2024-01-06 12:20:00-07:00,13.8353 +1673,2024-01-06 12:25:00-07:00,14.0429 +1674,2024-01-06 12:30:00-07:00,13.8373 +1675,2024-01-06 12:35:00-07:00,10.2575 +1676,2024-01-06 12:40:00-07:00,12.6866 +1677,2024-01-06 12:45:00-07:00,10.3269 +1678,2024-01-06 12:50:00-07:00,10.4028 +1679,2024-01-06 12:55:00-07:00,10.4153 +1680,2024-01-06 13:00:00-07:00,12.5461 +1681,2024-01-06 13:05:00-07:00,0.18 +1682,2024-01-06 13:10:00-07:00,0.1776 +1683,2024-01-06 13:15:00-07:00,0.1689 +1684,2024-01-06 13:20:00-07:00,0.1742 +1685,2024-01-06 13:25:00-07:00,12.4437 +1686,2024-01-06 13:30:00-07:00,10.3979 +1687,2024-01-06 13:35:00-07:00,12.6453 +1688,2024-01-06 13:40:00-07:00,12.8937 +1689,2024-01-06 13:45:00-07:00,12.9023 +1690,2024-01-06 13:50:00-07:00,13.1521 +1691,2024-01-06 13:55:00-07:00,10.5285 +1692,2024-01-06 14:00:00-07:00,0.1631 +1693,2024-01-06 14:05:00-07:00,10.5688 +1694,2024-01-06 14:10:00-07:00,12.6167 +1695,2024-01-06 14:15:00-07:00,17.5766 +1696,2024-01-06 14:20:00-07:00,14.2505 +1697,2024-01-06 14:25:00-07:00,19.1926 +1698,2024-01-06 14:30:00-07:00,14.6209 +1699,2024-01-06 14:35:00-07:00,14.4018 +1700,2024-01-06 14:40:00-07:00,23.6232 +1701,2024-01-06 14:45:00-07:00,14.6526 +1702,2024-01-06 14:50:00-07:00,26.5704 +1703,2024-01-06 14:55:00-07:00,22.139 +1704,2024-01-06 15:00:00-07:00,23.591 +1705,2024-01-06 15:05:00-07:00,22.3374 +1706,2024-01-06 15:10:00-07:00,15.2907 +1707,2024-01-06 15:15:00-07:00,15.3755 +1708,2024-01-06 15:20:00-07:00,15.541 +1709,2024-01-06 15:25:00-07:00,15.7593 +1710,2024-01-06 15:30:00-07:00,16.4803 +1711,2024-01-06 15:35:00-07:00,18.7527 +1712,2024-01-06 15:40:00-07:00,18.8628 +1713,2024-01-06 15:45:00-07:00,19.1051 +1714,2024-01-06 15:50:00-07:00,21.8444 +1715,2024-01-06 15:55:00-07:00,22.0054 +1716,2024-01-06 16:00:00-07:00,22.2418 +1717,2024-01-06 16:05:00-07:00,26.9394 +1718,2024-01-06 16:10:00-07:00,23.5431 +1719,2024-01-06 16:15:00-07:00,23.1493 +1720,2024-01-06 16:20:00-07:00,32.8658 +1721,2024-01-06 16:25:00-07:00,25.1727 +1722,2024-01-06 16:30:00-07:00,30.4881 +1723,2024-01-06 16:35:00-07:00,34.2819 +1724,2024-01-06 16:40:00-07:00,37.8462 +1725,2024-01-06 16:45:00-07:00,666.9504 +1726,2024-01-06 16:50:00-07:00,34.7949 +1727,2024-01-06 16:55:00-07:00,38.4166 +1728,2024-01-06 17:00:00-07:00,33.5379 +1729,2024-01-06 17:05:00-07:00,30.7033 +1730,2024-01-06 17:10:00-07:00,30.7647 +1731,2024-01-06 17:15:00-07:00,25.9506 +1732,2024-01-06 17:20:00-07:00,24.3036 +1733,2024-01-06 17:25:00-07:00,23.7284 +1734,2024-01-06 17:30:00-07:00,23.2899 +1735,2024-01-06 17:35:00-07:00,30.2986 +1736,2024-01-06 17:40:00-07:00,23.9438 +1737,2024-01-06 17:45:00-07:00,22.4372 +1738,2024-01-06 17:50:00-07:00,22.559 +1739,2024-01-06 17:55:00-07:00,22.2098 +1740,2024-01-06 18:00:00-07:00,20.8444 +1741,2024-01-06 18:05:00-07:00,20.4147 +1742,2024-01-06 18:10:00-07:00,16.6634 +1743,2024-01-06 18:15:00-07:00,17.4837 +1744,2024-01-06 18:20:00-07:00,18.4812 +1745,2024-01-06 18:25:00-07:00,18.2484 +1746,2024-01-06 18:30:00-07:00,18.1475 +1747,2024-01-06 18:35:00-07:00,17.8888 +1748,2024-01-06 18:40:00-07:00,17.8669 +1749,2024-01-06 18:45:00-07:00,17.8002 +1750,2024-01-06 18:50:00-07:00,17.5131 +1751,2024-01-06 18:55:00-07:00,16.405 +1752,2024-01-06 19:00:00-07:00,16.5767 +1753,2024-01-06 19:05:00-07:00,15.806 +1754,2024-01-06 19:10:00-07:00,16.4859 +1755,2024-01-06 19:15:00-07:00,17.3419 +1756,2024-01-06 19:20:00-07:00,17.1414 +1757,2024-01-06 19:25:00-07:00,17.1826 +1758,2024-01-06 19:30:00-07:00,17.334 +1759,2024-01-06 19:35:00-07:00,17.3708 +1760,2024-01-06 19:40:00-07:00,17.2238 +1761,2024-01-06 19:45:00-07:00,17.3305 +1762,2024-01-06 19:50:00-07:00,17.1644 +1763,2024-01-06 19:55:00-07:00,17.2715 +1764,2024-01-06 20:00:00-07:00,19.2853 +1765,2024-01-06 20:05:00-07:00,18.4903 +1766,2024-01-06 20:10:00-07:00,19.1887 +1767,2024-01-06 20:15:00-07:00,18.8553 +1768,2024-01-06 20:20:00-07:00,18.5715 +1769,2024-01-06 20:25:00-07:00,18.6875 +1770,2024-01-06 20:30:00-07:00,18.7089 +1771,2024-01-06 20:35:00-07:00,19.1273 +1772,2024-01-06 20:40:00-07:00,19.5876 +1773,2024-01-06 20:45:00-07:00,19.7743 +1774,2024-01-06 20:50:00-07:00,19.694 +1775,2024-01-06 20:55:00-07:00,19.6816 +1776,2024-01-06 21:00:00-07:00,20.006 +1777,2024-01-06 21:05:00-07:00,20.2596 +1778,2024-01-06 21:10:00-07:00,20.9695 +1779,2024-01-06 21:15:00-07:00,21.5503 +1780,2024-01-06 21:20:00-07:00,21.1184 +1781,2024-01-06 21:25:00-07:00,20.5382 +1782,2024-01-06 21:30:00-07:00,20.1389 +1783,2024-01-06 21:35:00-07:00,18.9846 +1784,2024-01-06 21:40:00-07:00,18.5996 +1785,2024-01-06 21:45:00-07:00,17.6959 +1786,2024-01-06 21:50:00-07:00,17.8402 +1787,2024-01-06 21:55:00-07:00,18.2687 +1788,2024-01-06 22:00:00-07:00,21.4621 +1789,2024-01-06 22:05:00-07:00,30.5458 +1790,2024-01-06 22:10:00-07:00,17.9361 +1791,2024-01-06 22:15:00-07:00,17.8581 +1792,2024-01-06 22:20:00-07:00,17.284 +1793,2024-01-06 22:25:00-07:00,16.9783 +1794,2024-01-06 22:30:00-07:00,17.2438 +1795,2024-01-06 22:35:00-07:00,17.2407 +1796,2024-01-06 22:40:00-07:00,17.2929 +1797,2024-01-06 22:45:00-07:00,17.3508 +1798,2024-01-06 22:50:00-07:00,17.4101 +1799,2024-01-06 22:55:00-07:00,17.565 +1800,2024-01-06 23:00:00-07:00,17.7163 +1801,2024-01-06 23:05:00-07:00,21.3367 +1802,2024-01-06 23:10:00-07:00,20.7182 +1803,2024-01-06 23:15:00-07:00,19.9525 +1804,2024-01-06 23:20:00-07:00,19.2485 +1805,2024-01-06 23:25:00-07:00,18.9408 +1806,2024-01-06 23:30:00-07:00,18.9386 +1807,2024-01-06 23:35:00-07:00,18.8061 +1808,2024-01-06 23:40:00-07:00,18.9386 +1809,2024-01-06 23:45:00-07:00,19.0155 +1810,2024-01-06 23:50:00-07:00,18.8146 +1811,2024-01-06 23:55:00-07:00,17.7061 +1812,2024-01-07 00:00:00-07:00,17.9907 +1813,2024-01-07 00:05:00-07:00,18.0858 +1814,2024-01-07 00:10:00-07:00,17.9041 +1815,2024-01-07 00:15:00-07:00,17.9295 +1816,2024-01-07 00:20:00-07:00,18.0822 +1817,2024-01-07 00:25:00-07:00,17.8891 +1818,2024-01-07 00:30:00-07:00,17.706 +1819,2024-01-07 00:35:00-07:00,17.351 +1820,2024-01-07 00:40:00-07:00,17.3492 +1821,2024-01-07 00:45:00-07:00,17.2349 +1822,2024-01-07 00:50:00-07:00,17.3214 +1823,2024-01-07 00:55:00-07:00,18.0604 +1824,2024-01-07 01:00:00-07:00,20.5444 +1825,2024-01-07 01:05:00-07:00,18.3114 +1826,2024-01-07 01:10:00-07:00,18.6527 +1827,2024-01-07 01:15:00-07:00,20.6301 +1828,2024-01-07 01:20:00-07:00,20.6397 +1829,2024-01-07 01:25:00-07:00,20.7881 +1830,2024-01-07 01:30:00-07:00,20.7797 +1831,2024-01-07 01:35:00-07:00,20.912 +1832,2024-01-07 01:40:00-07:00,21.043 +1833,2024-01-07 01:45:00-07:00,21.6523 +1834,2024-01-07 01:50:00-07:00,21.8633 +1835,2024-01-07 01:55:00-07:00,35.9632 +1836,2024-01-07 02:00:00-07:00,32.8218 +1837,2024-01-07 02:05:00-07:00,37.3803 +1838,2024-01-07 02:10:00-07:00,22.3141 +1839,2024-01-07 02:15:00-07:00,22.4699 +1840,2024-01-07 02:20:00-07:00,22.5639 +1841,2024-01-07 02:25:00-07:00,22.7136 +1842,2024-01-07 02:30:00-07:00,22.5803 +1843,2024-01-07 02:35:00-07:00,22.5095 +1844,2024-01-07 02:40:00-07:00,22.4417 +1845,2024-01-07 02:45:00-07:00,32.1816 +1846,2024-01-07 02:50:00-07:00,29.7354 +1847,2024-01-07 02:55:00-07:00,36.5288 +1848,2024-01-07 03:00:00-07:00,37.7175 +1849,2024-01-07 03:05:00-07:00,34.6253 +1850,2024-01-07 03:10:00-07:00,29.7013 +1851,2024-01-07 03:15:00-07:00,37.2716 +1852,2024-01-07 03:20:00-07:00,36.1031 +1853,2024-01-07 03:25:00-07:00,32.7465 +1854,2024-01-07 03:30:00-07:00,22.2489 +1855,2024-01-07 03:35:00-07:00,36.0696 +1856,2024-01-07 03:40:00-07:00,22.2708 +1857,2024-01-07 03:45:00-07:00,22.0797 +1858,2024-01-07 03:50:00-07:00,21.8852 +1859,2024-01-07 03:55:00-07:00,22.1955 +1860,2024-01-07 04:00:00-07:00,22.2414 +1861,2024-01-07 04:05:00-07:00,22.1816 +1862,2024-01-07 04:10:00-07:00,22.1424 +1863,2024-01-07 04:15:00-07:00,21.6559 +1864,2024-01-07 04:20:00-07:00,21.2367 +1865,2024-01-07 04:25:00-07:00,19.0772 +1866,2024-01-07 04:30:00-07:00,18.6561 +1867,2024-01-07 04:35:00-07:00,18.738 +1868,2024-01-07 04:40:00-07:00,18.522 +1869,2024-01-07 04:45:00-07:00,18.6427 +1870,2024-01-07 04:50:00-07:00,18.665 +1871,2024-01-07 04:55:00-07:00,18.7696 +1872,2024-01-07 05:00:00-07:00,18.2552 +1873,2024-01-07 05:05:00-07:00,18.4306 +1874,2024-01-07 05:10:00-07:00,18.3109 +1875,2024-01-07 05:15:00-07:00,17.1969 +1876,2024-01-07 05:20:00-07:00,15.9792 +1877,2024-01-07 05:25:00-07:00,15.8249 +1878,2024-01-07 05:30:00-07:00,15.9382 +1879,2024-01-07 05:35:00-07:00,16.4223 +1880,2024-01-07 05:40:00-07:00,16.8101 +1881,2024-01-07 05:45:00-07:00,21.5512 +1882,2024-01-07 05:50:00-07:00,20.453 +1883,2024-01-07 05:55:00-07:00,20.3457 +1884,2024-01-07 06:00:00-07:00,17.7213 +1885,2024-01-07 06:05:00-07:00,17.9097 +1886,2024-01-07 06:10:00-07:00,17.9915 +1887,2024-01-07 06:15:00-07:00,18.3454 +1888,2024-01-07 06:20:00-07:00,19.1546 +1889,2024-01-07 06:25:00-07:00,20.3889 +1890,2024-01-07 06:30:00-07:00,20.6438 +1891,2024-01-07 06:35:00-07:00,21.9931 +1892,2024-01-07 06:40:00-07:00,22.0218 +1893,2024-01-07 06:45:00-07:00,22.1667 +1894,2024-01-07 06:50:00-07:00,22.323 +1895,2024-01-07 06:55:00-07:00,23.6693 +1896,2024-01-07 07:00:00-07:00,25.2966 +1897,2024-01-07 07:05:00-07:00,26.2578 +1898,2024-01-07 07:10:00-07:00,41.388 +1899,2024-01-07 07:15:00-07:00,27.1425 +1900,2024-01-07 07:20:00-07:00,36.8711 +1901,2024-01-07 07:25:00-07:00,37.7172 +1902,2024-01-07 07:30:00-07:00,26.042 +1903,2024-01-07 07:35:00-07:00,25.7643 +1904,2024-01-07 07:40:00-07:00,27.3796 +1905,2024-01-07 07:45:00-07:00,30.4737 +1906,2024-01-07 07:50:00-07:00,27.219 +1907,2024-01-07 07:55:00-07:00,26.7491 +1908,2024-01-07 08:00:00-07:00,36.9479 +1909,2024-01-07 08:05:00-07:00,27.7561 +1910,2024-01-07 08:10:00-07:00,40.2788 +1911,2024-01-07 08:15:00-07:00,25.5307 +1912,2024-01-07 08:20:00-07:00,24.6974 +1913,2024-01-07 08:25:00-07:00,32.755 +1914,2024-01-07 08:30:00-07:00,37.7484 +1915,2024-01-07 08:35:00-07:00,26.6671 +1916,2024-01-07 08:40:00-07:00,22.5627 +1917,2024-01-07 08:45:00-07:00,29.9319 +1918,2024-01-07 08:50:00-07:00,22.3426 +1919,2024-01-07 08:55:00-07:00,32.0417 +1920,2024-01-07 09:00:00-07:00,22.3093 +1921,2024-01-07 09:05:00-07:00,22.1646 +1922,2024-01-07 09:10:00-07:00,36.2221 +1923,2024-01-07 09:15:00-07:00,32.7429 +1924,2024-01-07 09:20:00-07:00,35.265 +1925,2024-01-07 09:25:00-07:00,22.0697 +1926,2024-01-07 09:30:00-07:00,21.5507 +1927,2024-01-07 09:35:00-07:00,30.6026 +1928,2024-01-07 09:40:00-07:00,21.1272 +1929,2024-01-07 09:45:00-07:00,20.1226 +1930,2024-01-07 09:50:00-07:00,20.0889 +1931,2024-01-07 09:55:00-07:00,33.4417 +1932,2024-01-07 10:00:00-07:00,23.5149 +1933,2024-01-07 10:05:00-07:00,26.0313 +1934,2024-01-07 10:10:00-07:00,22.0215 +1935,2024-01-07 10:15:00-07:00,20.206 +1936,2024-01-07 10:20:00-07:00,19.5785 +1937,2024-01-07 10:25:00-07:00,31.8118 +1938,2024-01-07 10:30:00-07:00,32.7017 +1939,2024-01-07 10:35:00-07:00,17.5155 +1940,2024-01-07 10:40:00-07:00,17.7804 +1941,2024-01-07 10:45:00-07:00,18.415 +1942,2024-01-07 10:50:00-07:00,18.395 +1943,2024-01-07 10:55:00-07:00,18.6543 +1944,2024-01-07 11:00:00-07:00,18.7622 +1945,2024-01-07 11:05:00-07:00,19.1766 +1946,2024-01-07 11:10:00-07:00,19.6237 +1947,2024-01-07 11:15:00-07:00,22.0155 +1948,2024-01-07 11:20:00-07:00,22.2488 +1949,2024-01-07 11:25:00-07:00,36.8546 +1950,2024-01-07 11:30:00-07:00,22.4199 +1951,2024-01-07 11:35:00-07:00,22.7544 +1952,2024-01-07 11:40:00-07:00,33.7773 +1953,2024-01-07 11:45:00-07:00,39.1727 +1954,2024-01-07 11:50:00-07:00,30.3776 +1955,2024-01-07 11:55:00-07:00,32.643 +1956,2024-01-07 12:00:00-07:00,25.4159 +1957,2024-01-07 12:05:00-07:00,38.5968 +1958,2024-01-07 12:10:00-07:00,22.8979 +1959,2024-01-07 12:15:00-07:00,22.4609 +1960,2024-01-07 12:20:00-07:00,29.6335 +1961,2024-01-07 12:25:00-07:00,31.2569 +1962,2024-01-07 12:30:00-07:00,24.3938 +1963,2024-01-07 12:35:00-07:00,36.739 +1964,2024-01-07 12:40:00-07:00,34.7046 +1965,2024-01-07 12:45:00-07:00,24.266 +1966,2024-01-07 12:50:00-07:00,23.9946 +1967,2024-01-07 12:55:00-07:00,23.9838 +1968,2024-01-07 13:00:00-07:00,23.3552 +1969,2024-01-07 13:05:00-07:00,22.9815 +1970,2024-01-07 13:10:00-07:00,22.7912 +1971,2024-01-07 13:15:00-07:00,22.5362 +1972,2024-01-07 13:20:00-07:00,22.412 +1973,2024-01-07 13:25:00-07:00,29.9677 +1974,2024-01-07 13:30:00-07:00,34.2264 +1975,2024-01-07 13:35:00-07:00,31.7004 +1976,2024-01-07 13:40:00-07:00,20.8292 +1977,2024-01-07 13:45:00-07:00,22.3879 +1978,2024-01-07 13:50:00-07:00,20.6882 +1979,2024-01-07 13:55:00-07:00,26.339 +1980,2024-01-07 14:00:00-07:00,19.1061 +1981,2024-01-07 14:05:00-07:00,24.8727 +1982,2024-01-07 14:10:00-07:00,25.0038 +1983,2024-01-07 14:15:00-07:00,17.7629 +1984,2024-01-07 14:20:00-07:00,29.744 +1985,2024-01-07 14:25:00-07:00,19.2132 +1986,2024-01-07 14:30:00-07:00,28.627 +1987,2024-01-07 14:35:00-07:00,20.2732 +1988,2024-01-07 14:40:00-07:00,20.6119 +1989,2024-01-07 14:45:00-07:00,19.3558 +1990,2024-01-07 14:50:00-07:00,29.4273 +1991,2024-01-07 14:55:00-07:00,20.2672 +1992,2024-01-07 15:00:00-07:00,23.1525 +1993,2024-01-07 15:05:00-07:00,18.6325 +1994,2024-01-07 15:10:00-07:00,22.1622 +1995,2024-01-07 15:15:00-07:00,20.7787 +1996,2024-01-07 15:20:00-07:00,19.6979 +1997,2024-01-07 15:25:00-07:00,20.2166 +1998,2024-01-07 15:30:00-07:00,22.2117 +1999,2024-01-07 15:35:00-07:00,23.0614 +2000,2024-01-07 15:40:00-07:00,23.409 +2001,2024-01-07 15:45:00-07:00,38.5931 +2002,2024-01-07 15:50:00-07:00,67.7466 +2003,2024-01-07 15:55:00-07:00,694.5076 +2004,2024-01-07 16:00:00-07:00,39.969 +2005,2024-01-07 16:05:00-07:00,37.0366 +2006,2024-01-07 16:10:00-07:00,27.7363 +2007,2024-01-07 16:15:00-07:00,25.9811 +2008,2024-01-07 16:20:00-07:00,26.9662 +2009,2024-01-07 16:25:00-07:00,32.3544 +2010,2024-01-07 16:30:00-07:00,28.1032 +2011,2024-01-07 16:35:00-07:00,30.5866 +2012,2024-01-07 16:40:00-07:00,36.8259 +2013,2024-01-07 16:45:00-07:00,36.8464 +2014,2024-01-07 16:50:00-07:00,36.972 +2015,2024-01-07 16:55:00-07:00,36.8076 +2016,2024-01-07 17:00:00-07:00,35.9903 +2017,2024-01-07 17:05:00-07:00,36.0337 +2018,2024-01-07 17:10:00-07:00,36.0571 +2019,2024-01-07 17:15:00-07:00,27.5782 +2020,2024-01-07 17:20:00-07:00,27.4922 +2021,2024-01-07 17:25:00-07:00,26.3792 +2022,2024-01-07 17:30:00-07:00,39.1066 +2023,2024-01-07 17:35:00-07:00,25.7174 +2024,2024-01-07 17:40:00-07:00,26.269 +2025,2024-01-07 17:45:00-07:00,40.2597 +2026,2024-01-07 17:50:00-07:00,37.1492 +2027,2024-01-07 17:55:00-07:00,25.6958 +2028,2024-01-07 18:00:00-07:00,26.4549 +2029,2024-01-07 18:05:00-07:00,37.9819 +2030,2024-01-07 18:10:00-07:00,25.6155 +2031,2024-01-07 18:15:00-07:00,40.8857 +2032,2024-01-07 18:20:00-07:00,26.2457 +2033,2024-01-07 18:25:00-07:00,26.2675 +2034,2024-01-07 18:30:00-07:00,25.3838 +2035,2024-01-07 18:35:00-07:00,25.5422 +2036,2024-01-07 18:40:00-07:00,25.5152 +2037,2024-01-07 18:45:00-07:00,25.5574 +2038,2024-01-07 18:50:00-07:00,25.5786 +2039,2024-01-07 18:55:00-07:00,25.5885 +2040,2024-01-07 19:00:00-07:00,25.6144 +2041,2024-01-07 19:05:00-07:00,27.2276 +2042,2024-01-07 19:10:00-07:00,25.63 +2043,2024-01-07 19:15:00-07:00,25.7193 +2044,2024-01-07 19:20:00-07:00,25.7036 +2045,2024-01-07 19:25:00-07:00,24.9123 +2046,2024-01-07 19:30:00-07:00,24.0651 +2047,2024-01-07 19:35:00-07:00,23.9142 +2048,2024-01-07 19:40:00-07:00,23.5701 +2049,2024-01-07 19:45:00-07:00,22.9933 +2050,2024-01-07 19:50:00-07:00,22.6273 +2051,2024-01-07 19:55:00-07:00,22.5396 +2052,2024-01-07 20:00:00-07:00,22.6864 +2053,2024-01-07 20:05:00-07:00,22.5241 +2054,2024-01-07 20:10:00-07:00,22.3714 +2055,2024-01-07 20:15:00-07:00,22.2483 +2056,2024-01-07 20:20:00-07:00,22.2082 +2057,2024-01-07 20:25:00-07:00,22.1278 +2058,2024-01-07 20:30:00-07:00,21.9233 +2059,2024-01-07 20:35:00-07:00,21.7044 +2060,2024-01-07 20:40:00-07:00,21.6191 +2061,2024-01-07 20:45:00-07:00,21.4358 +2062,2024-01-07 20:50:00-07:00,20.5364 +2063,2024-01-07 20:55:00-07:00,19.8891 +2064,2024-01-07 21:00:00-07:00,20.7756 +2065,2024-01-07 21:05:00-07:00,20.5633 +2066,2024-01-07 21:10:00-07:00,21.2495 +2067,2024-01-07 21:15:00-07:00,20.5821 +2068,2024-01-07 21:20:00-07:00,19.1784 +2069,2024-01-07 21:25:00-07:00,19.1183 +2070,2024-01-07 21:30:00-07:00,18.9341 +2071,2024-01-07 21:35:00-07:00,19.4875 +2072,2024-01-07 21:40:00-07:00,19.4075 +2073,2024-01-07 21:45:00-07:00,15.8884 +2074,2024-01-07 21:50:00-07:00,15.7858 +2075,2024-01-07 21:55:00-07:00,15.9465 +2076,2024-01-07 22:00:00-07:00,16.1804 +2077,2024-01-07 22:05:00-07:00,18.5196 +2078,2024-01-07 22:10:00-07:00,17.8348 +2079,2024-01-07 22:15:00-07:00,17.506 +2080,2024-01-07 22:20:00-07:00,14.8586 +2081,2024-01-07 22:25:00-07:00,14.8668 +2082,2024-01-07 22:30:00-07:00,15.5476 +2083,2024-01-07 22:35:00-07:00,15.35 +2084,2024-01-07 22:40:00-07:00,15.0657 +2085,2024-01-07 22:45:00-07:00,10.1693 +2086,2024-01-07 22:50:00-07:00,15.0668 +2087,2024-01-07 22:55:00-07:00,15.3586 +2088,2024-01-07 23:00:00-07:00,15.0678 +2089,2024-01-07 23:05:00-07:00,16.8937 +2090,2024-01-07 23:10:00-07:00,15.8551 +2091,2024-01-07 23:15:00-07:00,24.3412 +2092,2024-01-07 23:20:00-07:00,16.8766 +2093,2024-01-07 23:25:00-07:00,16.4121 +2094,2024-01-07 23:30:00-07:00,16.5004 +2095,2024-01-07 23:35:00-07:00,16.0223 +2096,2024-01-07 23:40:00-07:00,15.9732 +2097,2024-01-07 23:45:00-07:00,15.8979 +2098,2024-01-07 23:50:00-07:00,15.9335 +2099,2024-01-07 23:55:00-07:00,15.9976 +2100,2024-01-08 00:00:00-07:00,16.1927 +2101,2024-01-08 00:05:00-07:00,16.5428 +2102,2024-01-08 00:10:00-07:00,16.6162 +2103,2024-01-08 00:15:00-07:00,16.9641 +2104,2024-01-08 00:20:00-07:00,16.9277 +2105,2024-01-08 00:25:00-07:00,16.8527 +2106,2024-01-08 00:30:00-07:00,16.6576 +2107,2024-01-08 00:35:00-07:00,16.3995 +2108,2024-01-08 00:40:00-07:00,16.9465 +2109,2024-01-08 00:45:00-07:00,16.7596 +2110,2024-01-08 00:50:00-07:00,16.425 +2111,2024-01-08 00:55:00-07:00,15.789 +2112,2024-01-08 01:00:00-07:00,15.2528 +2113,2024-01-08 01:05:00-07:00,15.0926 +2114,2024-01-08 01:10:00-07:00,14.7536 +2115,2024-01-08 01:15:00-07:00,14.8007 +2116,2024-01-08 01:20:00-07:00,14.8595 +2117,2024-01-08 01:25:00-07:00,14.9125 +2118,2024-01-08 01:30:00-07:00,14.9876 +2119,2024-01-08 01:35:00-07:00,15.0242 +2120,2024-01-08 01:40:00-07:00,15.1938 +2121,2024-01-08 01:45:00-07:00,15.353 +2122,2024-01-08 01:50:00-07:00,15.3288 +2123,2024-01-08 01:55:00-07:00,15.2503 +2124,2024-01-08 02:00:00-07:00,15.2466 +2125,2024-01-08 02:05:00-07:00,15.2022 +2126,2024-01-08 02:10:00-07:00,15.1877 +2127,2024-01-08 02:15:00-07:00,15.1264 +2128,2024-01-08 02:20:00-07:00,15.0673 +2129,2024-01-08 02:25:00-07:00,15.062 +2130,2024-01-08 02:30:00-07:00,14.938 +2131,2024-01-08 02:35:00-07:00,14.8967 +2132,2024-01-08 02:40:00-07:00,14.873 +2133,2024-01-08 02:45:00-07:00,14.7874 +2134,2024-01-08 02:50:00-07:00,14.8133 +2135,2024-01-08 02:55:00-07:00,14.7467 +2136,2024-01-08 03:00:00-07:00,14.8124 +2137,2024-01-08 03:05:00-07:00,14.8432 +2138,2024-01-08 03:10:00-07:00,14.8125 +2139,2024-01-08 03:15:00-07:00,14.6228 +2140,2024-01-08 03:20:00-07:00,14.4414 +2141,2024-01-08 03:25:00-07:00,14.1835 +2142,2024-01-08 03:30:00-07:00,13.8016 +2143,2024-01-08 03:35:00-07:00,13.7743 +2144,2024-01-08 03:40:00-07:00,14.1447 +2145,2024-01-08 03:45:00-07:00,14.2297 +2146,2024-01-08 03:50:00-07:00,14.1694 +2147,2024-01-08 03:55:00-07:00,14.1922 +2148,2024-01-08 04:00:00-07:00,13.7957 +2149,2024-01-08 04:05:00-07:00,13.414 +2150,2024-01-08 04:10:00-07:00,13.9096 +2151,2024-01-08 04:15:00-07:00,13.9545 +2152,2024-01-08 04:20:00-07:00,14.0419 +2153,2024-01-08 04:25:00-07:00,14.0502 +2154,2024-01-08 04:30:00-07:00,14.1081 +2155,2024-01-08 04:35:00-07:00,14.1691 +2156,2024-01-08 04:40:00-07:00,14.2344 +2157,2024-01-08 04:45:00-07:00,14.3007 +2158,2024-01-08 04:50:00-07:00,14.4255 +2159,2024-01-08 04:55:00-07:00,14.5273 +2160,2024-01-08 05:00:00-07:00,14.4327 +2161,2024-01-08 05:05:00-07:00,14.4327 +2162,2024-01-08 05:10:00-07:00,14.4403 +2163,2024-01-08 05:15:00-07:00,14.5462 +2164,2024-01-08 05:20:00-07:00,14.5282 +2165,2024-01-08 05:25:00-07:00,14.6134 +2166,2024-01-08 05:30:00-07:00,14.6592 +2167,2024-01-08 05:35:00-07:00,14.7222 +2168,2024-01-08 05:40:00-07:00,14.7862 +2169,2024-01-08 05:45:00-07:00,14.924 +2170,2024-01-08 05:50:00-07:00,15.1084 +2171,2024-01-08 05:55:00-07:00,14.943 +2172,2024-01-08 06:00:00-07:00,14.2984 +2173,2024-01-08 06:05:00-07:00,14.7703 +2174,2024-01-08 06:10:00-07:00,14.7677 +2175,2024-01-08 06:15:00-07:00,14.6796 +2176,2024-01-08 06:20:00-07:00,14.7139 +2177,2024-01-08 06:25:00-07:00,14.867 +2178,2024-01-08 06:30:00-07:00,27.8933 +2179,2024-01-08 06:35:00-07:00,30.5673 +2180,2024-01-08 06:40:00-07:00,30.696 +2181,2024-01-08 06:45:00-07:00,15.4461 +2182,2024-01-08 06:50:00-07:00,29.7307 +2183,2024-01-08 06:55:00-07:00,15.8469 +2184,2024-01-08 07:00:00-07:00,31.2973 +2185,2024-01-08 07:05:00-07:00,16.2059 +2186,2024-01-08 07:10:00-07:00,24.6385 +2187,2024-01-08 07:15:00-07:00,27.0253 +2188,2024-01-08 07:20:00-07:00,29.6952 +2189,2024-01-08 07:25:00-07:00,32.4776 +2190,2024-01-08 07:30:00-07:00,32.0487 +2191,2024-01-08 07:35:00-07:00,22.2483 +2192,2024-01-08 07:40:00-07:00,29.2286 +2193,2024-01-08 07:45:00-07:00,17.0397 +2194,2024-01-08 07:50:00-07:00,24.0536 +2195,2024-01-08 07:55:00-07:00,18.1896 +2196,2024-01-08 08:00:00-07:00,22.6969 +2197,2024-01-08 08:05:00-07:00,29.2714 +2198,2024-01-08 08:10:00-07:00,20.0549 +2199,2024-01-08 08:15:00-07:00,31.378 +2200,2024-01-08 08:20:00-07:00,20.0425 +2201,2024-01-08 08:25:00-07:00,33.3045 +2202,2024-01-08 08:30:00-07:00,30.1506 +2203,2024-01-08 08:35:00-07:00,23.7659 +2204,2024-01-08 08:40:00-07:00,23.6938 +2205,2024-01-08 08:45:00-07:00,23.3226 +2206,2024-01-08 08:50:00-07:00,22.4826 +2207,2024-01-08 08:55:00-07:00,18.6208 +2208,2024-01-08 09:00:00-07:00,17.4149 +2209,2024-01-08 09:05:00-07:00,17.533 +2210,2024-01-08 09:10:00-07:00,17.6656 +2211,2024-01-08 09:15:00-07:00,20.7109 +2212,2024-01-08 09:20:00-07:00,20.2105 +2213,2024-01-08 09:25:00-07:00,18.4026 +2214,2024-01-08 09:30:00-07:00,18.2438 +2215,2024-01-08 09:35:00-07:00,18.0447 +2216,2024-01-08 09:40:00-07:00,17.9254 +2217,2024-01-08 09:45:00-07:00,17.7049 +2218,2024-01-08 09:50:00-07:00,17.6051 +2219,2024-01-08 09:55:00-07:00,17.5316 +2220,2024-01-08 10:00:00-07:00,17.4683 +2221,2024-01-08 10:05:00-07:00,18.0867 +2222,2024-01-08 10:10:00-07:00,19.1098 +2223,2024-01-08 10:15:00-07:00,18.8184 +2224,2024-01-08 10:20:00-07:00,19.1351 +2225,2024-01-08 10:25:00-07:00,18.3426 +2226,2024-01-08 10:30:00-07:00,18.4794 +2227,2024-01-08 10:35:00-07:00,18.7694 +2228,2024-01-08 10:40:00-07:00,17.6083 +2229,2024-01-08 10:45:00-07:00,17.5601 +2230,2024-01-08 10:50:00-07:00,17.949 +2231,2024-01-08 10:55:00-07:00,18.0007 +2232,2024-01-08 11:00:00-07:00,18.5057 +2233,2024-01-08 11:05:00-07:00,18.7386 +2234,2024-01-08 11:10:00-07:00,19.0657 +2235,2024-01-08 11:15:00-07:00,18.8633 +2236,2024-01-08 11:20:00-07:00,17.5042 +2237,2024-01-08 11:25:00-07:00,18.7353 +2238,2024-01-08 11:30:00-07:00,18.4811 +2239,2024-01-08 11:35:00-07:00,33.9833 +2240,2024-01-08 11:40:00-07:00,17.5548 +2241,2024-01-08 11:45:00-07:00,31.1641 +2242,2024-01-08 11:50:00-07:00,25.8303 +2243,2024-01-08 11:55:00-07:00,17.0439 +2244,2024-01-08 12:00:00-07:00,30.5687 +2245,2024-01-08 12:05:00-07:00,31.9623 +2246,2024-01-08 12:10:00-07:00,31.3805 +2247,2024-01-08 12:15:00-07:00,17.1978 +2248,2024-01-08 12:20:00-07:00,17.1786 +2249,2024-01-08 12:25:00-07:00,17.1714 +2250,2024-01-08 12:30:00-07:00,16.9696 +2251,2024-01-08 12:35:00-07:00,17.2167 +2252,2024-01-08 12:40:00-07:00,30.1323 +2253,2024-01-08 12:45:00-07:00,31.901 +2254,2024-01-08 12:50:00-07:00,23.936 +2255,2024-01-08 12:55:00-07:00,32.0237 +2256,2024-01-08 13:00:00-07:00,16.6104 +2257,2024-01-08 13:05:00-07:00,17.3734 +2258,2024-01-08 13:10:00-07:00,31.7539 +2259,2024-01-08 13:15:00-07:00,17.0336 +2260,2024-01-08 13:20:00-07:00,15.8526 +2261,2024-01-08 13:25:00-07:00,15.7181 +2262,2024-01-08 13:30:00-07:00,23.7189 +2263,2024-01-08 13:35:00-07:00,15.682 +2264,2024-01-08 13:40:00-07:00,15.7489 +2265,2024-01-08 13:45:00-07:00,15.5742 +2266,2024-01-08 13:50:00-07:00,15.5467 +2267,2024-01-08 13:55:00-07:00,15.3587 +2268,2024-01-08 14:00:00-07:00,15.1977 +2269,2024-01-08 14:05:00-07:00,15.3593 +2270,2024-01-08 14:10:00-07:00,15.1476 +2271,2024-01-08 14:15:00-07:00,15.0705 +2272,2024-01-08 14:20:00-07:00,15.0684 +2273,2024-01-08 14:25:00-07:00,15.0321 +2274,2024-01-08 14:30:00-07:00,15.0262 +2275,2024-01-08 14:35:00-07:00,14.9615 +2276,2024-01-08 14:40:00-07:00,15.0043 +2277,2024-01-08 14:45:00-07:00,14.9731 +2278,2024-01-08 14:50:00-07:00,14.882 +2279,2024-01-08 14:55:00-07:00,14.8086 +2280,2024-01-08 15:00:00-07:00,10.0285 +2281,2024-01-08 15:05:00-07:00,14.5692 +2282,2024-01-08 15:10:00-07:00,14.7035 +2283,2024-01-08 15:15:00-07:00,14.7807 +2284,2024-01-08 15:20:00-07:00,14.711 +2285,2024-01-08 15:25:00-07:00,14.743 +2286,2024-01-08 15:30:00-07:00,14.9415 +2287,2024-01-08 15:35:00-07:00,16.6927 +2288,2024-01-08 15:40:00-07:00,15.662 +2289,2024-01-08 15:45:00-07:00,16.5414 +2290,2024-01-08 15:50:00-07:00,17.3326 +2291,2024-01-08 15:55:00-07:00,20.7449 +2292,2024-01-08 16:00:00-07:00,20.351 +2293,2024-01-08 16:05:00-07:00,20.704 +2294,2024-01-08 16:10:00-07:00,18.2203 +2295,2024-01-08 16:15:00-07:00,17.337 +2296,2024-01-08 16:20:00-07:00,18.5797 +2297,2024-01-08 16:25:00-07:00,20.5792 +2298,2024-01-08 16:30:00-07:00,20.1848 +2299,2024-01-08 16:35:00-07:00,27.7112 +2300,2024-01-08 16:40:00-07:00,36.7357 +2301,2024-01-08 16:45:00-07:00,23.154 +2302,2024-01-08 16:50:00-07:00,31.0548 +2303,2024-01-08 16:55:00-07:00,23.3577 +2304,2024-01-08 17:00:00-07:00,23.5358 +2305,2024-01-08 17:05:00-07:00,23.1209 +2306,2024-01-08 17:10:00-07:00,23.1988 +2307,2024-01-08 17:15:00-07:00,23.1661 +2308,2024-01-08 17:20:00-07:00,23.1353 +2309,2024-01-08 17:25:00-07:00,23.1765 +2310,2024-01-08 17:30:00-07:00,23.0025 +2311,2024-01-08 17:35:00-07:00,23.7337 +2312,2024-01-08 17:40:00-07:00,23.1174 +2313,2024-01-08 17:45:00-07:00,22.8468 +2314,2024-01-08 17:50:00-07:00,22.3738 +2315,2024-01-08 17:55:00-07:00,22.167 +2316,2024-01-08 18:00:00-07:00,23.0018 +2317,2024-01-08 18:05:00-07:00,22.1352 +2318,2024-01-08 18:10:00-07:00,22.5806 +2319,2024-01-08 18:15:00-07:00,22.1706 +2320,2024-01-08 18:20:00-07:00,22.1608 +2321,2024-01-08 18:25:00-07:00,22.022 +2322,2024-01-08 18:30:00-07:00,21.5533 +2323,2024-01-08 18:35:00-07:00,21.5592 +2324,2024-01-08 18:40:00-07:00,19.2692 +2325,2024-01-08 18:45:00-07:00,19.1615 +2326,2024-01-08 18:50:00-07:00,18.9676 +2327,2024-01-08 18:55:00-07:00,18.9647 +2328,2024-01-08 19:00:00-07:00,22.5802 +2329,2024-01-08 19:05:00-07:00,22.0474 +2330,2024-01-08 19:10:00-07:00,22.832 +2331,2024-01-08 19:15:00-07:00,22.6991 +2332,2024-01-08 19:20:00-07:00,22.2314 +2333,2024-01-08 19:25:00-07:00,21.979 +2334,2024-01-08 19:30:00-07:00,21.7075 +2335,2024-01-08 19:35:00-07:00,22.0762 +2336,2024-01-08 19:40:00-07:00,22.0476 +2337,2024-01-08 19:45:00-07:00,21.4832 +2338,2024-01-08 19:50:00-07:00,20.7271 +2339,2024-01-08 19:55:00-07:00,21.197 +2340,2024-01-08 20:00:00-07:00,22.4336 +2341,2024-01-08 20:05:00-07:00,22.3009 +2342,2024-01-08 20:10:00-07:00,22.1174 +2343,2024-01-08 20:15:00-07:00,22.3208 +2344,2024-01-08 20:20:00-07:00,22.3064 +2345,2024-01-08 20:25:00-07:00,22.1123 +2346,2024-01-08 20:30:00-07:00,21.6174 +2347,2024-01-08 20:35:00-07:00,21.269 +2348,2024-01-08 20:40:00-07:00,20.9612 +2349,2024-01-08 20:45:00-07:00,20.5642 +2350,2024-01-08 20:50:00-07:00,17.6437 +2351,2024-01-08 20:55:00-07:00,19.4184 +2352,2024-01-08 21:00:00-07:00,20.6316 +2353,2024-01-08 21:05:00-07:00,18.9581 +2354,2024-01-08 21:10:00-07:00,18.9997 +2355,2024-01-08 21:15:00-07:00,18.7402 +2356,2024-01-08 21:20:00-07:00,18.5286 +2357,2024-01-08 21:25:00-07:00,18.2442 +2358,2024-01-08 21:30:00-07:00,18.1392 +2359,2024-01-08 21:35:00-07:00,20.5089 +2360,2024-01-08 21:40:00-07:00,19.7698 +2361,2024-01-08 21:45:00-07:00,18.5775 +2362,2024-01-08 21:50:00-07:00,17.5497 +2363,2024-01-08 21:55:00-07:00,16.921 +2364,2024-01-08 22:00:00-07:00,16.6895 +2365,2024-01-08 22:05:00-07:00,17.1527 +2366,2024-01-08 22:10:00-07:00,17.566 +2367,2024-01-08 22:15:00-07:00,17.7073 +2368,2024-01-08 22:20:00-07:00,17.5034 +2369,2024-01-08 22:25:00-07:00,17.9677 +2370,2024-01-08 22:30:00-07:00,17.7651 +2371,2024-01-08 22:35:00-07:00,17.8447 +2372,2024-01-08 22:40:00-07:00,17.7278 +2373,2024-01-08 22:45:00-07:00,23.6789 +2374,2024-01-08 22:50:00-07:00,18.2321 +2375,2024-01-08 22:55:00-07:00,18.1838 +2376,2024-01-08 23:00:00-07:00,23.7237 +2377,2024-01-08 23:05:00-07:00,20.8216 +2378,2024-01-08 23:10:00-07:00,21.663 +2379,2024-01-08 23:15:00-07:00,20.4979 +2380,2024-01-08 23:20:00-07:00,20.6323 +2381,2024-01-08 23:25:00-07:00,19.9298 +2382,2024-01-08 23:30:00-07:00,19.8345 +2383,2024-01-08 23:35:00-07:00,19.3049 +2384,2024-01-08 23:40:00-07:00,19.6701 +2385,2024-01-08 23:45:00-07:00,19.1407 +2386,2024-01-08 23:50:00-07:00,17.9052 +2387,2024-01-08 23:55:00-07:00,22.1301 +2388,2024-01-09 00:00:00-07:00,23.2238 +2389,2024-01-09 00:05:00-07:00,21.7548 +2390,2024-01-09 00:10:00-07:00,19.2977 +2391,2024-01-09 00:15:00-07:00,19.0436 +2392,2024-01-09 00:20:00-07:00,19.7046 +2393,2024-01-09 00:25:00-07:00,19.6714 +2394,2024-01-09 00:30:00-07:00,19.7076 +2395,2024-01-09 00:35:00-07:00,20.4169 +2396,2024-01-09 00:40:00-07:00,20.3191 +2397,2024-01-09 00:45:00-07:00,19.8211 +2398,2024-01-09 00:50:00-07:00,20.5805 +2399,2024-01-09 00:55:00-07:00,18.6896 +2400,2024-01-09 01:00:00-07:00,18.8531 +2401,2024-01-09 01:05:00-07:00,19.0693 +2402,2024-01-09 01:10:00-07:00,18.9469 +2403,2024-01-09 01:15:00-07:00,18.9623 +2404,2024-01-09 01:20:00-07:00,18.7558 +2405,2024-01-09 01:25:00-07:00,17.8038 +2406,2024-01-09 01:30:00-07:00,18.2102 +2407,2024-01-09 01:35:00-07:00,18.0663 +2408,2024-01-09 01:40:00-07:00,18.1062 +2409,2024-01-09 01:45:00-07:00,18.2026 +2410,2024-01-09 01:50:00-07:00,18.0735 +2411,2024-01-09 01:55:00-07:00,16.8413 +2412,2024-01-09 02:00:00-07:00,16.5083 +2413,2024-01-09 02:05:00-07:00,17.1387 +2414,2024-01-09 02:10:00-07:00,17.2551 +2415,2024-01-09 02:15:00-07:00,17.0269 +2416,2024-01-09 02:20:00-07:00,16.9553 +2417,2024-01-09 02:25:00-07:00,16.8989 +2418,2024-01-09 02:30:00-07:00,17.0146 +2419,2024-01-09 02:35:00-07:00,16.9149 +2420,2024-01-09 02:40:00-07:00,17.0141 +2421,2024-01-09 02:45:00-07:00,17.2404 +2422,2024-01-09 02:50:00-07:00,17.2998 +2423,2024-01-09 02:55:00-07:00,17.5348 +2424,2024-01-09 03:00:00-07:00,17.6178 +2425,2024-01-09 03:05:00-07:00,17.5471 +2426,2024-01-09 03:10:00-07:00,17.6956 +2427,2024-01-09 03:15:00-07:00,17.8918 +2428,2024-01-09 03:20:00-07:00,17.8323 +2429,2024-01-09 03:25:00-07:00,17.9399 +2430,2024-01-09 03:30:00-07:00,17.9793 +2431,2024-01-09 03:35:00-07:00,17.837 +2432,2024-01-09 03:40:00-07:00,17.8479 +2433,2024-01-09 03:45:00-07:00,17.985 +2434,2024-01-09 03:50:00-07:00,18.0802 +2435,2024-01-09 03:55:00-07:00,16.8494 +2436,2024-01-09 04:00:00-07:00,16.2776 +2437,2024-01-09 04:05:00-07:00,16.8702 +2438,2024-01-09 04:10:00-07:00,17.183 +2439,2024-01-09 04:15:00-07:00,17.2892 +2440,2024-01-09 04:20:00-07:00,17.4044 +2441,2024-01-09 04:25:00-07:00,17.5626 +2442,2024-01-09 04:30:00-07:00,17.6725 +2443,2024-01-09 04:35:00-07:00,17.9179 +2444,2024-01-09 04:40:00-07:00,18.9115 +2445,2024-01-09 04:45:00-07:00,19.549 +2446,2024-01-09 04:50:00-07:00,19.2411 +2447,2024-01-09 04:55:00-07:00,22.7213 +2448,2024-01-09 05:00:00-07:00,19.0874 +2449,2024-01-09 05:05:00-07:00,19.2967 +2450,2024-01-09 05:10:00-07:00,19.5597 +2451,2024-01-09 05:15:00-07:00,18.7343 +2452,2024-01-09 05:20:00-07:00,18.473 +2453,2024-01-09 05:25:00-07:00,18.8523 +2454,2024-01-09 05:30:00-07:00,18.9309 +2455,2024-01-09 05:35:00-07:00,19.1486 +2456,2024-01-09 05:40:00-07:00,19.6149 +2457,2024-01-09 05:45:00-07:00,20.4439 +2458,2024-01-09 05:50:00-07:00,22.0544 +2459,2024-01-09 05:55:00-07:00,23.2228 +2460,2024-01-09 06:00:00-07:00,20.42 +2461,2024-01-09 06:05:00-07:00,21.2837 +2462,2024-01-09 06:10:00-07:00,22.1703 +2463,2024-01-09 06:15:00-07:00,20.98 +2464,2024-01-09 06:20:00-07:00,20.9332 +2465,2024-01-09 06:25:00-07:00,22.8953 +2466,2024-01-09 06:30:00-07:00,23.5543 +2467,2024-01-09 06:35:00-07:00,24.027 +2468,2024-01-09 06:40:00-07:00,24.1961 +2469,2024-01-09 06:45:00-07:00,24.6595 +2470,2024-01-09 06:50:00-07:00,25.3 +2471,2024-01-09 06:55:00-07:00,25.8212 +2472,2024-01-09 07:00:00-07:00,26.4328 +2473,2024-01-09 07:05:00-07:00,26.8056 +2474,2024-01-09 07:10:00-07:00,27.3467 +2475,2024-01-09 07:15:00-07:00,27.2109 +2476,2024-01-09 07:20:00-07:00,28.2996 +2477,2024-01-09 07:25:00-07:00,28.1021 +2478,2024-01-09 07:30:00-07:00,27.2693 +2479,2024-01-09 07:35:00-07:00,27.286 +2480,2024-01-09 07:40:00-07:00,26.8391 +2481,2024-01-09 07:45:00-07:00,25.8512 +2482,2024-01-09 07:50:00-07:00,24.9049 +2483,2024-01-09 07:55:00-07:00,19.6671 +2484,2024-01-09 08:00:00-07:00,20.7773 +2485,2024-01-09 08:05:00-07:00,27.0759 +2486,2024-01-09 08:10:00-07:00,22.795 +2487,2024-01-09 08:15:00-07:00,23.0489 +2488,2024-01-09 08:20:00-07:00,23.2995 +2489,2024-01-09 08:25:00-07:00,22.3915 +2490,2024-01-09 08:30:00-07:00,20.8538 +2491,2024-01-09 08:35:00-07:00,21.9786 +2492,2024-01-09 08:40:00-07:00,21.5689 +2493,2024-01-09 08:45:00-07:00,20.2511 +2494,2024-01-09 08:50:00-07:00,19.2703 +2495,2024-01-09 08:55:00-07:00,18.2117 +2496,2024-01-09 09:00:00-07:00,17.8025 +2497,2024-01-09 09:05:00-07:00,17.9222 +2498,2024-01-09 09:10:00-07:00,18.5223 +2499,2024-01-09 09:15:00-07:00,18.3995 +2500,2024-01-09 09:20:00-07:00,18.3402 +2501,2024-01-09 09:25:00-07:00,18.4074 +2502,2024-01-09 09:30:00-07:00,18.4302 +2503,2024-01-09 09:35:00-07:00,18.436 +2504,2024-01-09 09:40:00-07:00,19.1996 +2505,2024-01-09 09:45:00-07:00,19.5898 +2506,2024-01-09 09:50:00-07:00,19.6047 +2507,2024-01-09 09:55:00-07:00,19.9885 +2508,2024-01-09 10:00:00-07:00,19.615 +2509,2024-01-09 10:05:00-07:00,19.7415 +2510,2024-01-09 10:10:00-07:00,19.7192 +2511,2024-01-09 10:15:00-07:00,19.8219 +2512,2024-01-09 10:20:00-07:00,19.6316 +2513,2024-01-09 10:25:00-07:00,20.1758 +2514,2024-01-09 10:30:00-07:00,19.6415 +2515,2024-01-09 10:35:00-07:00,19.3618 +2516,2024-01-09 10:40:00-07:00,17.8433 +2517,2024-01-09 10:45:00-07:00,19.3393 +2518,2024-01-09 10:50:00-07:00,19.9269 +2519,2024-01-09 10:55:00-07:00,19.3272 +2520,2024-01-09 11:00:00-07:00,22.0078 +2521,2024-01-09 11:05:00-07:00,21.41 +2522,2024-01-09 11:10:00-07:00,23.6859 +2523,2024-01-09 11:15:00-07:00,23.8377 +2524,2024-01-09 11:20:00-07:00,23.6605 +2525,2024-01-09 11:25:00-07:00,24.02 +2526,2024-01-09 11:30:00-07:00,22.1087 +2527,2024-01-09 11:35:00-07:00,22.5694 +2528,2024-01-09 11:40:00-07:00,22.0994 +2529,2024-01-09 11:45:00-07:00,22.1802 +2530,2024-01-09 11:50:00-07:00,22.2092 +2531,2024-01-09 11:55:00-07:00,21.6052 +2532,2024-01-09 12:00:00-07:00,22.1711 +2533,2024-01-09 12:05:00-07:00,22.5247 +2534,2024-01-09 12:10:00-07:00,23.393 +2535,2024-01-09 12:15:00-07:00,24.2137 +2536,2024-01-09 12:20:00-07:00,23.7851 +2537,2024-01-09 12:25:00-07:00,24.3041 +2538,2024-01-09 12:30:00-07:00,23.9984 +2539,2024-01-09 12:35:00-07:00,20.9905 +2540,2024-01-09 12:40:00-07:00,23.8773 +2541,2024-01-09 12:45:00-07:00,22.4628 +2542,2024-01-09 12:50:00-07:00,22.2275 +2543,2024-01-09 12:55:00-07:00,22.8984 +2544,2024-01-09 13:00:00-07:00,19.6784 +2545,2024-01-09 13:05:00-07:00,19.6639 +2546,2024-01-09 13:10:00-07:00,19.64 +2547,2024-01-09 13:15:00-07:00,19.1127 +2548,2024-01-09 13:20:00-07:00,20.7514 +2549,2024-01-09 13:25:00-07:00,19.6508 +2550,2024-01-09 13:30:00-07:00,22.6052 +2551,2024-01-09 13:35:00-07:00,22.8728 +2552,2024-01-09 13:40:00-07:00,24.507 +2553,2024-01-09 13:45:00-07:00,25.1128 +2554,2024-01-09 13:50:00-07:00,25.05 +2555,2024-01-09 13:55:00-07:00,24.2574 +2556,2024-01-09 14:00:00-07:00,24.3128 +2557,2024-01-09 14:05:00-07:00,24.1148 +2558,2024-01-09 14:10:00-07:00,23.2431 +2559,2024-01-09 14:15:00-07:00,23.6996 +2560,2024-01-09 14:20:00-07:00,24.0448 +2561,2024-01-09 14:25:00-07:00,23.9079 +2562,2024-01-09 14:30:00-07:00,23.9745 +2563,2024-01-09 14:35:00-07:00,23.2311 +2564,2024-01-09 14:40:00-07:00,18.2051 +2565,2024-01-09 14:45:00-07:00,18.8474 +2566,2024-01-09 14:50:00-07:00,23.2663 +2567,2024-01-09 14:55:00-07:00,22.7826 +2568,2024-01-09 15:00:00-07:00,21.1064 +2569,2024-01-09 15:05:00-07:00,17.0319 +2570,2024-01-09 15:10:00-07:00,19.7044 +2571,2024-01-09 15:15:00-07:00,19.0515 +2572,2024-01-09 15:20:00-07:00,17.7788 +2573,2024-01-09 15:25:00-07:00,10.4738 +2574,2024-01-09 15:30:00-07:00,10.3409 +2575,2024-01-09 15:35:00-07:00,10.3867 +2576,2024-01-09 15:40:00-07:00,18.197 +2577,2024-01-09 15:45:00-07:00,15.2902 +2578,2024-01-09 15:50:00-07:00,0.1641 +2579,2024-01-09 15:55:00-07:00,23.4353 +2580,2024-01-09 16:00:00-07:00,-0.8174 +2581,2024-01-09 16:05:00-07:00,14.851 +2582,2024-01-09 16:10:00-07:00,0.1773 +2583,2024-01-09 16:15:00-07:00,10.2942 +2584,2024-01-09 16:20:00-07:00,15.0021 +2585,2024-01-09 16:25:00-07:00,15.4145 +2586,2024-01-09 16:30:00-07:00,16.9927 +2587,2024-01-09 16:35:00-07:00,15.9672 +2588,2024-01-09 16:40:00-07:00,16.226 +2589,2024-01-09 16:45:00-07:00,16.3767 +2590,2024-01-09 16:50:00-07:00,16.686 +2591,2024-01-09 16:55:00-07:00,17.1362 +2592,2024-01-09 17:00:00-07:00,19.4119 +2593,2024-01-09 17:05:00-07:00,19.2734 +2594,2024-01-09 17:10:00-07:00,19.9216 +2595,2024-01-09 17:15:00-07:00,19.3999 +2596,2024-01-09 17:20:00-07:00,19.0155 +2597,2024-01-09 17:25:00-07:00,17.2645 +2598,2024-01-09 17:30:00-07:00,16.0765 +2599,2024-01-09 17:35:00-07:00,16.3578 +2600,2024-01-09 17:40:00-07:00,17.8175 +2601,2024-01-09 17:45:00-07:00,18.0481 +2602,2024-01-09 17:50:00-07:00,18.0329 +2603,2024-01-09 17:55:00-07:00,18.2034 +2604,2024-01-09 18:00:00-07:00,25.3434 +2605,2024-01-09 18:05:00-07:00,20.2226 +2606,2024-01-09 18:10:00-07:00,23.423 +2607,2024-01-09 18:15:00-07:00,18.4995 +2608,2024-01-09 18:20:00-07:00,19.8857 +2609,2024-01-09 18:25:00-07:00,19.8578 +2610,2024-01-09 18:30:00-07:00,21.0997 +2611,2024-01-09 18:35:00-07:00,19.7785 +2612,2024-01-09 18:40:00-07:00,18.7493 +2613,2024-01-09 18:45:00-07:00,18.394 +2614,2024-01-09 18:50:00-07:00,18.1236 +2615,2024-01-09 18:55:00-07:00,18.502 +2616,2024-01-09 19:00:00-07:00,52.575 +2617,2024-01-09 19:05:00-07:00,18.913 +2618,2024-01-09 19:10:00-07:00,19.7551 +2619,2024-01-09 19:15:00-07:00,20.0393 +2620,2024-01-09 19:20:00-07:00,20.482 +2621,2024-01-09 19:25:00-07:00,20.4493 +2622,2024-01-09 19:30:00-07:00,20.8752 +2623,2024-01-09 19:35:00-07:00,20.5001 +2624,2024-01-09 19:40:00-07:00,20.5587 +2625,2024-01-09 19:45:00-07:00,19.3797 +2626,2024-01-09 19:50:00-07:00,20.3721 +2627,2024-01-09 19:55:00-07:00,20.4319 +2628,2024-01-09 20:00:00-07:00,22.1284 +2629,2024-01-09 20:05:00-07:00,21.2827 +2630,2024-01-09 20:10:00-07:00,22.1886 +2631,2024-01-09 20:15:00-07:00,22.6548 +2632,2024-01-09 20:20:00-07:00,22.5213 +2633,2024-01-09 20:25:00-07:00,20.9785 +2634,2024-01-09 20:30:00-07:00,21.1931 +2635,2024-01-09 20:35:00-07:00,22.1101 +2636,2024-01-09 20:40:00-07:00,22.1042 +2637,2024-01-09 20:45:00-07:00,21.7543 +2638,2024-01-09 20:50:00-07:00,17.8582 +2639,2024-01-09 20:55:00-07:00,18.5264 +2640,2024-01-09 21:00:00-07:00,18.3756 +2641,2024-01-09 21:05:00-07:00,18.688 +2642,2024-01-09 21:10:00-07:00,20.4861 +2643,2024-01-09 21:15:00-07:00,19.3131 +2644,2024-01-09 21:20:00-07:00,19.0448 +2645,2024-01-09 21:25:00-07:00,18.4763 +2646,2024-01-09 21:30:00-07:00,18.8654 +2647,2024-01-09 21:35:00-07:00,18.5969 +2648,2024-01-09 21:40:00-07:00,18.5993 +2649,2024-01-09 21:45:00-07:00,18.5224 +2650,2024-01-09 21:50:00-07:00,17.6149 +2651,2024-01-09 21:55:00-07:00,17.7311 +2652,2024-01-09 22:00:00-07:00,18.931 +2653,2024-01-09 22:05:00-07:00,18.1622 +2654,2024-01-09 22:10:00-07:00,17.9644 +2655,2024-01-09 22:15:00-07:00,17.5583 +2656,2024-01-09 22:20:00-07:00,17.4324 +2657,2024-01-09 22:25:00-07:00,16.9019 +2658,2024-01-09 22:30:00-07:00,16.5029 +2659,2024-01-09 22:35:00-07:00,16.2497 +2660,2024-01-09 22:40:00-07:00,16.2055 +2661,2024-01-09 22:45:00-07:00,16.0699 +2662,2024-01-09 22:50:00-07:00,16.0092 +2663,2024-01-09 22:55:00-07:00,15.8494 +2664,2024-01-09 23:00:00-07:00,15.8776 +2665,2024-01-09 23:05:00-07:00,15.866 +2666,2024-01-09 23:10:00-07:00,15.8797 +2667,2024-01-09 23:15:00-07:00,15.693 +2668,2024-01-09 23:20:00-07:00,16.1274 +2669,2024-01-09 23:25:00-07:00,15.9863 +2670,2024-01-09 23:30:00-07:00,15.9802 +2671,2024-01-09 23:35:00-07:00,15.9469 +2672,2024-01-09 23:40:00-07:00,15.8971 +2673,2024-01-09 23:45:00-07:00,15.943 +2674,2024-01-09 23:50:00-07:00,15.9363 +2675,2024-01-09 23:55:00-07:00,15.7116 +2676,2024-01-10 00:00:00-07:00,15.6911 +2677,2024-01-10 00:05:00-07:00,15.6296 +2678,2024-01-10 00:10:00-07:00,15.6746 +2679,2024-01-10 00:15:00-07:00,15.7284 +2680,2024-01-10 00:20:00-07:00,15.5914 +2681,2024-01-10 00:25:00-07:00,15.4848 +2682,2024-01-10 00:30:00-07:00,15.4823 +2683,2024-01-10 00:35:00-07:00,15.422 +2684,2024-01-10 00:40:00-07:00,15.3617 +2685,2024-01-10 00:45:00-07:00,15.1969 +2686,2024-01-10 00:50:00-07:00,15.2476 +2687,2024-01-10 00:55:00-07:00,15.2061 +2688,2024-01-10 01:00:00-07:00,15.2172 +2689,2024-01-10 01:05:00-07:00,15.3132 +2690,2024-01-10 01:10:00-07:00,15.2796 +2691,2024-01-10 01:15:00-07:00,15.2593 +2692,2024-01-10 01:20:00-07:00,15.2373 +2693,2024-01-10 01:25:00-07:00,15.3007 +2694,2024-01-10 01:30:00-07:00,15.2763 +2695,2024-01-10 01:35:00-07:00,15.1556 +2696,2024-01-10 01:40:00-07:00,15.177 +2697,2024-01-10 01:45:00-07:00,15.1827 +2698,2024-01-10 01:50:00-07:00,15.2055 +2699,2024-01-10 01:55:00-07:00,15.2431 +2700,2024-01-10 02:00:00-07:00,15.2691 +2701,2024-01-10 02:05:00-07:00,15.2002 +2702,2024-01-10 02:10:00-07:00,15.1236 +2703,2024-01-10 02:15:00-07:00,15.0479 +2704,2024-01-10 02:20:00-07:00,14.1838 +2705,2024-01-10 02:25:00-07:00,14.4447 +2706,2024-01-10 02:30:00-07:00,13.265 +2707,2024-01-10 02:35:00-07:00,13.1302 +2708,2024-01-10 02:40:00-07:00,12.8642 +2709,2024-01-10 02:45:00-07:00,13.3752 +2710,2024-01-10 02:50:00-07:00,14.29 +2711,2024-01-10 02:55:00-07:00,13.7697 +2712,2024-01-10 03:00:00-07:00,13.7892 +2713,2024-01-10 03:05:00-07:00,14.1204 +2714,2024-01-10 03:10:00-07:00,14.0304 +2715,2024-01-10 03:15:00-07:00,14.0446 +2716,2024-01-10 03:20:00-07:00,14.0395 +2717,2024-01-10 03:25:00-07:00,14.4176 +2718,2024-01-10 03:30:00-07:00,14.2219 +2719,2024-01-10 03:35:00-07:00,13.5104 +2720,2024-01-10 03:40:00-07:00,13.2516 +2721,2024-01-10 03:45:00-07:00,15.674 +2722,2024-01-10 03:50:00-07:00,28.4418 +2723,2024-01-10 03:55:00-07:00,14.0741 +2724,2024-01-10 04:00:00-07:00,14.0469 +2725,2024-01-10 04:05:00-07:00,14.2164 +2726,2024-01-10 04:10:00-07:00,14.0534 +2727,2024-01-10 04:15:00-07:00,13.9095 +2728,2024-01-10 04:20:00-07:00,13.9462 +2729,2024-01-10 04:25:00-07:00,13.6469 +2730,2024-01-10 04:30:00-07:00,13.2617 +2731,2024-01-10 04:35:00-07:00,13.002 +2732,2024-01-10 04:40:00-07:00,12.4786 +2733,2024-01-10 04:45:00-07:00,12.958 +2734,2024-01-10 04:50:00-07:00,13.3864 +2735,2024-01-10 04:55:00-07:00,13.6512 +2736,2024-01-10 05:00:00-07:00,13.4845 +2737,2024-01-10 05:05:00-07:00,0.1744 +2738,2024-01-10 05:10:00-07:00,13.4472 +2739,2024-01-10 05:15:00-07:00,13.6274 +2740,2024-01-10 05:20:00-07:00,14.9829 +2741,2024-01-10 05:25:00-07:00,15.1438 +2742,2024-01-10 05:30:00-07:00,29.86 +2743,2024-01-10 05:35:00-07:00,29.9869 +2744,2024-01-10 05:40:00-07:00,30.4569 +2745,2024-01-10 05:45:00-07:00,14.5456 +2746,2024-01-10 05:50:00-07:00,0.1757 +2747,2024-01-10 05:55:00-07:00,15.9566 +2748,2024-01-10 06:00:00-07:00,15.3036 +2749,2024-01-10 06:05:00-07:00,15.3373 +2750,2024-01-10 06:10:00-07:00,15.3753 +2751,2024-01-10 06:15:00-07:00,15.4821 +2752,2024-01-10 06:20:00-07:00,15.5696 +2753,2024-01-10 06:25:00-07:00,15.7394 +2754,2024-01-10 06:30:00-07:00,15.4334 +2755,2024-01-10 06:35:00-07:00,15.4064 +2756,2024-01-10 06:40:00-07:00,15.3103 +2757,2024-01-10 06:45:00-07:00,15.8476 +2758,2024-01-10 06:50:00-07:00,18.2585 +2759,2024-01-10 06:55:00-07:00,19.6795 +2760,2024-01-10 07:00:00-07:00,21.3951 +2761,2024-01-10 07:05:00-07:00,15.8083 +2762,2024-01-10 07:10:00-07:00,15.8792 +2763,2024-01-10 07:15:00-07:00,15.9194 +2764,2024-01-10 07:20:00-07:00,15.8324 +2765,2024-01-10 07:25:00-07:00,15.7032 +2766,2024-01-10 07:30:00-07:00,15.6893 +2767,2024-01-10 07:35:00-07:00,15.5967 +2768,2024-01-10 07:40:00-07:00,16.4724 +2769,2024-01-10 07:45:00-07:00,15.4116 +2770,2024-01-10 07:50:00-07:00,15.3882 +2771,2024-01-10 07:55:00-07:00,16.2822 +2772,2024-01-10 08:00:00-07:00,19.529 +2773,2024-01-10 08:05:00-07:00,20.9917 +2774,2024-01-10 08:10:00-07:00,19.628 +2775,2024-01-10 08:15:00-07:00,18.8916 +2776,2024-01-10 08:20:00-07:00,18.7769 +2777,2024-01-10 08:25:00-07:00,18.1791 +2778,2024-01-10 08:30:00-07:00,12.0815 +2779,2024-01-10 08:35:00-07:00,16.8841 +2780,2024-01-10 08:40:00-07:00,18.2039 +2781,2024-01-10 08:45:00-07:00,18.5032 +2782,2024-01-10 08:50:00-07:00,18.0092 +2783,2024-01-10 08:55:00-07:00,18.5012 +2784,2024-01-10 09:00:00-07:00,18.8918 +2785,2024-01-10 09:05:00-07:00,15.3242 +2786,2024-01-10 09:10:00-07:00,16.8697 +2787,2024-01-10 09:15:00-07:00,16.1977 +2788,2024-01-10 09:20:00-07:00,17.3221 +2789,2024-01-10 09:25:00-07:00,16.6232 +2790,2024-01-10 09:30:00-07:00,0.1751 +2791,2024-01-10 09:35:00-07:00,0.1812 +2792,2024-01-10 09:40:00-07:00,-1.9572 +2793,2024-01-10 09:45:00-07:00,0.17 +2794,2024-01-10 09:50:00-07:00,10.1824 +2795,2024-01-10 09:55:00-07:00,16.131 +2796,2024-01-10 10:00:00-07:00,15.7141 +2797,2024-01-10 10:05:00-07:00,15.6777 +2798,2024-01-10 10:10:00-07:00,15.5367 +2799,2024-01-10 10:15:00-07:00,0.1812 +2800,2024-01-10 10:20:00-07:00,0.1867 +2801,2024-01-10 10:25:00-07:00,19.0741 +2802,2024-01-10 10:30:00-07:00,15.7252 +2803,2024-01-10 10:35:00-07:00,0.1846 +2804,2024-01-10 10:40:00-07:00,14.8718 +2805,2024-01-10 10:45:00-07:00,0.1877 +2806,2024-01-10 10:50:00-07:00,14.6842 +2807,2024-01-10 10:55:00-07:00,0.1872 +2808,2024-01-10 11:00:00-07:00,16.4152 +2809,2024-01-10 11:05:00-07:00,16.7738 +2810,2024-01-10 11:10:00-07:00,16.2568 +2811,2024-01-10 11:15:00-07:00,0.1885 +2812,2024-01-10 11:20:00-07:00,0.1845 +2813,2024-01-10 11:25:00-07:00,-0.8271 +2814,2024-01-10 11:30:00-07:00,14.5444 +2815,2024-01-10 11:35:00-07:00,0.1849 +2816,2024-01-10 11:40:00-07:00,0.1831 +2817,2024-01-10 11:45:00-07:00,17.0533 +2818,2024-01-10 11:50:00-07:00,0.1858 +2819,2024-01-10 11:55:00-07:00,15.8818 +2820,2024-01-10 12:00:00-07:00,0.1763 +2821,2024-01-10 12:05:00-07:00,16.8471 +2822,2024-01-10 12:10:00-07:00,16.006 +2823,2024-01-10 12:15:00-07:00,16.8873 +2824,2024-01-10 12:20:00-07:00,16.6642 +2825,2024-01-10 12:25:00-07:00,16.8599 +2826,2024-01-10 12:30:00-07:00,14.9592 +2827,2024-01-10 12:35:00-07:00,15.5008 +2828,2024-01-10 12:40:00-07:00,0.1829 +2829,2024-01-10 12:45:00-07:00,14.9396 +2830,2024-01-10 12:50:00-07:00,14.792 +2831,2024-01-10 12:55:00-07:00,13.8075 +2832,2024-01-10 13:00:00-07:00,0.184 +2833,2024-01-10 13:05:00-07:00,-40.7134 +2834,2024-01-10 13:10:00-07:00,-0.8227 +2835,2024-01-10 13:15:00-07:00,-1.921 +2836,2024-01-10 13:20:00-07:00,-40.7722 +2837,2024-01-10 13:25:00-07:00,-38.1266 +2838,2024-01-10 13:30:00-07:00,12.0365 +2839,2024-01-10 13:35:00-07:00,-27.8643 +2840,2024-01-10 13:40:00-07:00,-28.182 +2841,2024-01-10 13:45:00-07:00,-28.3912 +2842,2024-01-10 13:50:00-07:00,-36.3109 +2843,2024-01-10 13:55:00-07:00,-28.1757 +2844,2024-01-10 14:00:00-07:00,-28.0491 +2845,2024-01-10 14:05:00-07:00,0.1727 +2846,2024-01-10 14:10:00-07:00,0.1741 +2847,2024-01-10 14:15:00-07:00,0.1743 +2848,2024-01-10 14:20:00-07:00,15.4526 +2849,2024-01-10 14:25:00-07:00,14.0412 +2850,2024-01-10 14:30:00-07:00,0.1763 +2851,2024-01-10 14:35:00-07:00,0.1749 +2852,2024-01-10 14:40:00-07:00,14.9808 +2853,2024-01-10 14:45:00-07:00,18.8844 +2854,2024-01-10 14:50:00-07:00,18.8741 +2855,2024-01-10 14:55:00-07:00,17.3949 +2856,2024-01-10 15:00:00-07:00,14.3191 +2857,2024-01-10 15:05:00-07:00,17.1632 +2858,2024-01-10 15:10:00-07:00,0.1845 +2859,2024-01-10 15:15:00-07:00,16.8708 +2860,2024-01-10 15:20:00-07:00,13.9408 +2861,2024-01-10 15:25:00-07:00,16.4097 +2862,2024-01-10 15:30:00-07:00,19.1255 +2863,2024-01-10 15:35:00-07:00,19.6548 +2864,2024-01-10 15:40:00-07:00,19.8437 +2865,2024-01-10 15:45:00-07:00,20.1696 +2866,2024-01-10 15:50:00-07:00,20.2572 +2867,2024-01-10 15:55:00-07:00,20.5058 +2868,2024-01-10 16:00:00-07:00,20.6931 +2869,2024-01-10 16:05:00-07:00,21.4015 +2870,2024-01-10 16:10:00-07:00,20.9867 +2871,2024-01-10 16:15:00-07:00,21.7397 +2872,2024-01-10 16:20:00-07:00,19.3167 +2873,2024-01-10 16:25:00-07:00,20.3964 +2874,2024-01-10 16:30:00-07:00,21.233 +2875,2024-01-10 16:35:00-07:00,28.6017 +2876,2024-01-10 16:40:00-07:00,29.1504 +2877,2024-01-10 16:45:00-07:00,30.2808 +2878,2024-01-10 16:50:00-07:00,346.114 +2879,2024-01-10 16:55:00-07:00,577.794 +2880,2024-01-10 17:00:00-07:00,32.8435 +2881,2024-01-10 17:05:00-07:00,28.966 +2882,2024-01-10 17:10:00-07:00,28.7591 +2883,2024-01-10 17:15:00-07:00,28.7473 +2884,2024-01-10 17:20:00-07:00,28.8053 +2885,2024-01-10 17:25:00-07:00,29.284 +2886,2024-01-10 17:30:00-07:00,28.8683 +2887,2024-01-10 17:35:00-07:00,29.2702 +2888,2024-01-10 17:40:00-07:00,30.0118 +2889,2024-01-10 17:45:00-07:00,29.5859 +2890,2024-01-10 17:50:00-07:00,29.1485 +2891,2024-01-10 17:55:00-07:00,29.2623 +2892,2024-01-10 18:00:00-07:00,28.9849 +2893,2024-01-10 18:05:00-07:00,28.898 +2894,2024-01-10 18:10:00-07:00,28.915 +2895,2024-01-10 18:15:00-07:00,28.7154 +2896,2024-01-10 18:20:00-07:00,28.6702 +2897,2024-01-10 18:25:00-07:00,28.4597 +2898,2024-01-10 18:30:00-07:00,26.9229 +2899,2024-01-10 18:35:00-07:00,25.7916 +2900,2024-01-10 18:40:00-07:00,25.1774 +2901,2024-01-10 18:45:00-07:00,25.7127 +2902,2024-01-10 18:50:00-07:00,27.6608 +2903,2024-01-10 18:55:00-07:00,28.2523 +2904,2024-01-10 19:00:00-07:00,28.6932 +2905,2024-01-10 19:05:00-07:00,29.0018 +2906,2024-01-10 19:10:00-07:00,29.1043 +2907,2024-01-10 19:15:00-07:00,29.1274 +2908,2024-01-10 19:20:00-07:00,29.1638 +2909,2024-01-10 19:25:00-07:00,29.2039 +2910,2024-01-10 19:30:00-07:00,29.1787 +2911,2024-01-10 19:35:00-07:00,29.2372 +2912,2024-01-10 19:40:00-07:00,29.1957 +2913,2024-01-10 19:45:00-07:00,29.1873 +2914,2024-01-10 19:50:00-07:00,29.1384 +2915,2024-01-10 19:55:00-07:00,29.075 +2916,2024-01-10 20:00:00-07:00,29.1191 +2917,2024-01-10 20:05:00-07:00,29.0676 +2918,2024-01-10 20:10:00-07:00,28.8813 +2919,2024-01-10 20:15:00-07:00,28.9638 +2920,2024-01-10 20:20:00-07:00,28.9789 +2921,2024-01-10 20:25:00-07:00,29.1822 +2922,2024-01-10 20:30:00-07:00,29.1584 +2923,2024-01-10 20:35:00-07:00,29.1139 +2924,2024-01-10 20:40:00-07:00,28.868 +2925,2024-01-10 20:45:00-07:00,28.6953 +2926,2024-01-10 20:50:00-07:00,27.9788 +2927,2024-01-10 20:55:00-07:00,28.7082 +2928,2024-01-10 21:00:00-07:00,28.7852 +2929,2024-01-10 21:05:00-07:00,28.9174 +2930,2024-01-10 21:10:00-07:00,28.9265 +2931,2024-01-10 21:15:00-07:00,28.8795 +2932,2024-01-10 21:20:00-07:00,28.9718 +2933,2024-01-10 21:25:00-07:00,28.7966 +2934,2024-01-10 21:30:00-07:00,28.8574 +2935,2024-01-10 21:35:00-07:00,28.6766 +2936,2024-01-10 21:40:00-07:00,28.527 +2937,2024-01-10 21:45:00-07:00,28.1656 +2938,2024-01-10 21:50:00-07:00,26.9799 +2939,2024-01-10 21:55:00-07:00,25.6537 +2940,2024-01-10 22:00:00-07:00,24.3525 +2941,2024-01-10 22:10:00-07:00,25.1843 +2942,2024-01-10 22:15:00-07:00,24.8247 +2943,2024-01-10 22:20:00-07:00,25.1235 +2944,2024-01-10 22:25:00-07:00,25.5212 +2945,2024-01-10 22:30:00-07:00,25.5174 +2946,2024-01-10 22:35:00-07:00,24.9071 +2947,2024-01-10 22:40:00-07:00,24.5458 +2948,2024-01-10 22:45:00-07:00,25.5048 +2949,2024-01-10 22:50:00-07:00,25.5017 +2950,2024-01-10 22:55:00-07:00,25.4854 +2951,2024-01-10 23:00:00-07:00,26.8985 +2952,2024-01-10 23:05:00-07:00,28.4503 +2953,2024-01-10 23:10:00-07:00,29.349 +2954,2024-01-10 23:15:00-07:00,26.9313 +2955,2024-01-10 23:20:00-07:00,24.9453 +2956,2024-01-10 23:25:00-07:00,22.9526 +2957,2024-01-10 23:30:00-07:00,22.4635 +2958,2024-01-10 23:35:00-07:00,22.1084 +2959,2024-01-10 23:40:00-07:00,21.9375 +2960,2024-01-10 23:45:00-07:00,21.2836 +2961,2024-01-10 23:50:00-07:00,20.6484 +2962,2024-01-10 23:55:00-07:00,21.3862 +2963,2024-01-11 00:00:00-07:00,21.7041 +2964,2024-01-11 00:05:00-07:00,22.5939 +2965,2024-01-11 00:10:00-07:00,25.5793 +2966,2024-01-11 00:15:00-07:00,25.7326 +2967,2024-01-11 00:20:00-07:00,29.6351 +2968,2024-01-11 00:25:00-07:00,27.962 +2969,2024-01-11 00:30:00-07:00,26.4518 +2970,2024-01-11 00:35:00-07:00,27.0478 +2971,2024-01-11 00:40:00-07:00,25.5952 +2972,2024-01-11 00:45:00-07:00,23.2768 +2973,2024-01-11 00:50:00-07:00,23.6395 +2974,2024-01-11 00:55:00-07:00,23.0865 +2975,2024-01-11 01:00:00-07:00,27.856 +2976,2024-01-11 01:05:00-07:00,22.7533 +2977,2024-01-11 01:10:00-07:00,23.6368 +2978,2024-01-11 01:15:00-07:00,23.2882 +2979,2024-01-11 01:20:00-07:00,21.8447 +2980,2024-01-11 01:25:00-07:00,20.4839 +2981,2024-01-11 01:30:00-07:00,20.8366 +2982,2024-01-11 01:35:00-07:00,21.539 +2983,2024-01-11 01:40:00-07:00,21.5176 +2984,2024-01-11 01:45:00-07:00,20.9012 +2985,2024-01-11 01:50:00-07:00,20.982 +2986,2024-01-11 01:55:00-07:00,21.4138 +2987,2024-01-11 02:00:00-07:00,23.2038 +2988,2024-01-11 02:05:00-07:00,21.7263 +2989,2024-01-11 02:10:00-07:00,21.028 +2990,2024-01-11 02:15:00-07:00,20.4895 +2991,2024-01-11 02:20:00-07:00,20.1813 +2992,2024-01-11 02:25:00-07:00,19.9688 +2993,2024-01-11 02:30:00-07:00,19.5634 +2994,2024-01-11 02:35:00-07:00,19.379 +2995,2024-01-11 02:40:00-07:00,18.9293 +2996,2024-01-11 02:45:00-07:00,18.2837 +2997,2024-01-11 02:50:00-07:00,17.4388 +2998,2024-01-11 02:55:00-07:00,18.1788 +2999,2024-01-11 03:00:00-07:00,18.7997 +3000,2024-01-11 03:05:00-07:00,18.5302 +3001,2024-01-11 03:10:00-07:00,18.3784 +3002,2024-01-11 03:15:00-07:00,18.3171 +3003,2024-01-11 03:20:00-07:00,18.3005 +3004,2024-01-11 03:25:00-07:00,18.1581 +3005,2024-01-11 03:30:00-07:00,17.9313 +3006,2024-01-11 03:35:00-07:00,17.7977 +3007,2024-01-11 03:40:00-07:00,17.6823 +3008,2024-01-11 03:45:00-07:00,17.6498 +3009,2024-01-11 03:50:00-07:00,17.9319 +3010,2024-01-11 03:55:00-07:00,17.8036 +3011,2024-01-11 04:00:00-07:00,17.5879 +3012,2024-01-11 04:05:00-07:00,17.7425 +3013,2024-01-11 04:10:00-07:00,18.0586 +3014,2024-01-11 04:15:00-07:00,18.2048 +3015,2024-01-11 04:20:00-07:00,18.2749 +3016,2024-01-11 04:25:00-07:00,18.2486 +3017,2024-01-11 04:30:00-07:00,18.3295 +3018,2024-01-11 04:35:00-07:00,18.3588 +3019,2024-01-11 04:40:00-07:00,18.2779 +3020,2024-01-11 04:45:00-07:00,18.5703 +3021,2024-01-11 04:50:00-07:00,18.751 +3022,2024-01-11 04:55:00-07:00,18.9103 +3023,2024-01-11 05:00:00-07:00,18.8674 +3024,2024-01-11 05:05:00-07:00,19.014 +3025,2024-01-11 05:10:00-07:00,18.8874 +3026,2024-01-11 05:15:00-07:00,18.7591 +3027,2024-01-11 05:20:00-07:00,18.6843 +3028,2024-01-11 05:25:00-07:00,18.6282 +3029,2024-01-11 05:30:00-07:00,18.5617 +3030,2024-01-11 05:35:00-07:00,18.5733 +3031,2024-01-11 05:40:00-07:00,18.6196 +3032,2024-01-11 05:45:00-07:00,18.6005 +3033,2024-01-11 05:50:00-07:00,18.71 +3034,2024-01-11 05:55:00-07:00,18.8712 +3035,2024-01-11 06:00:00-07:00,19.0801 +3036,2024-01-11 06:05:00-07:00,19.5032 +3037,2024-01-11 06:10:00-07:00,19.5069 +3038,2024-01-11 06:15:00-07:00,19.4726 +3039,2024-01-11 06:20:00-07:00,19.2802 +3040,2024-01-11 06:25:00-07:00,19.1387 +3041,2024-01-11 06:30:00-07:00,19.4285 +3042,2024-01-11 06:35:00-07:00,19.6455 +3043,2024-01-11 06:40:00-07:00,19.8016 +3044,2024-01-11 06:45:00-07:00,20.2097 +3045,2024-01-11 06:50:00-07:00,20.3223 +3046,2024-01-11 06:55:00-07:00,20.7878 +3047,2024-01-11 07:00:00-07:00,21.1585 +3048,2024-01-11 07:05:00-07:00,21.737 +3049,2024-01-11 07:10:00-07:00,21.9839 +3050,2024-01-11 07:15:00-07:00,21.8327 +3051,2024-01-11 07:20:00-07:00,21.3835 +3052,2024-01-11 07:25:00-07:00,21.0555 +3053,2024-01-11 07:30:00-07:00,20.9844 +3054,2024-01-11 07:35:00-07:00,20.3918 +3055,2024-01-11 07:40:00-07:00,20.3926 +3056,2024-01-11 07:50:00-07:00,20.1055 +3057,2024-01-11 07:55:00-07:00,19.9052 +3058,2024-01-11 08:00:00-07:00,19.3306 +3059,2024-01-11 08:05:00-07:00,19.3582 +3060,2024-01-11 08:10:00-07:00,19.4683 +3061,2024-01-11 08:15:00-07:00,19.4579 +3062,2024-01-11 08:20:00-07:00,19.8375 +3063,2024-01-11 08:25:00-07:00,19.5456 +3064,2024-01-11 08:30:00-07:00,19.5473 +3065,2024-01-11 08:35:00-07:00,19.3767 +3066,2024-01-11 08:40:00-07:00,19.348 +3067,2024-01-11 08:45:00-07:00,19.5038 +3068,2024-01-11 08:50:00-07:00,19.3408 +3069,2024-01-11 08:55:00-07:00,19.5232 +3070,2024-01-11 09:00:00-07:00,19.5393 +3071,2024-01-11 09:05:00-07:00,19.3861 +3072,2024-01-11 09:10:00-07:00,19.1061 +3073,2024-01-11 09:15:00-07:00,18.9168 +3074,2024-01-11 09:20:00-07:00,18.5161 +3075,2024-01-11 09:25:00-07:00,18.432 +3076,2024-01-11 09:30:00-07:00,17.9926 +3077,2024-01-11 09:35:00-07:00,17.4568 +3078,2024-01-11 09:40:00-07:00,10.4683 +3079,2024-01-11 09:45:00-07:00,10.4154 +3080,2024-01-11 09:50:00-07:00,0.1753 +3081,2024-01-11 09:55:00-07:00,0.1726 +3082,2024-01-11 10:00:00-07:00,0.1822 +3083,2024-01-11 10:05:00-07:00,0.1834 +3084,2024-01-11 10:10:00-07:00,0.1828 +3085,2024-01-11 10:15:00-07:00,14.753 +3086,2024-01-11 10:20:00-07:00,14.668 +3087,2024-01-11 10:25:00-07:00,14.6705 +3088,2024-01-11 10:30:00-07:00,10.3541 +3089,2024-01-11 10:35:00-07:00,14.9114 +3090,2024-01-11 10:40:00-07:00,15.1919 +3091,2024-01-11 10:45:00-07:00,15.0831 +3092,2024-01-11 10:50:00-07:00,15.6623 +3093,2024-01-11 10:55:00-07:00,10.5469 +3094,2024-01-11 11:00:00-07:00,14.697 +3095,2024-01-11 11:05:00-07:00,14.7033 +3096,2024-01-11 11:10:00-07:00,15.3609 +3097,2024-01-11 11:15:00-07:00,15.078 +3098,2024-01-11 11:20:00-07:00,14.986 +3099,2024-01-11 11:25:00-07:00,14.7607 +3100,2024-01-11 11:30:00-07:00,10.5133 +3101,2024-01-11 11:35:00-07:00,10.4632 +3102,2024-01-11 11:40:00-07:00,2.5724 +3103,2024-01-11 11:45:00-07:00,2.5721 +3104,2024-01-11 11:50:00-07:00,14.3875 +3105,2024-01-11 11:55:00-07:00,10.3956 +3106,2024-01-11 12:00:00-07:00,10.4654 +3107,2024-01-11 12:05:00-07:00,2.8108 +3108,2024-01-11 12:10:00-07:00,2.829 +3109,2024-01-11 12:15:00-07:00,10.2798 +3110,2024-01-11 12:20:00-07:00,10.3158 +3111,2024-01-11 12:25:00-07:00,10.2743 +3112,2024-01-11 12:30:00-07:00,10.2595 +3113,2024-01-11 12:35:00-07:00,10.3113 +3114,2024-01-11 12:40:00-07:00,13.4858 +3115,2024-01-11 12:45:00-07:00,13.9511 +3116,2024-01-11 12:50:00-07:00,13.4738 +3117,2024-01-11 12:55:00-07:00,2.5632 +3118,2024-01-11 13:00:00-07:00,2.5248 +3119,2024-01-11 13:05:00-07:00,13.9715 +3120,2024-01-11 13:10:00-07:00,13.4426 +3121,2024-01-11 13:15:00-07:00,10.6182 +3122,2024-01-11 13:20:00-07:00,2.5204 +3123,2024-01-11 13:25:00-07:00,2.5084 +3124,2024-01-11 13:30:00-07:00,10.5411 +3125,2024-01-11 13:35:00-07:00,14.6914 +3126,2024-01-11 13:40:00-07:00,14.5544 +3127,2024-01-11 13:45:00-07:00,16.6534 +3128,2024-01-11 13:50:00-07:00,16.0513 +3129,2024-01-11 13:55:00-07:00,13.4821 +3130,2024-01-11 14:00:00-07:00,14.1235 +3131,2024-01-11 14:05:00-07:00,14.2741 +3132,2024-01-11 14:10:00-07:00,14.7744 +3133,2024-01-11 14:15:00-07:00,13.6429 +3134,2024-01-11 14:20:00-07:00,13.6066 +3135,2024-01-11 14:25:00-07:00,14.112 +3136,2024-01-11 14:30:00-07:00,14.102 +3137,2024-01-11 14:35:00-07:00,10.3488 +3138,2024-01-11 14:40:00-07:00,14.019 +3139,2024-01-11 14:45:00-07:00,13.9305 +3140,2024-01-11 14:50:00-07:00,15.6717 +3141,2024-01-11 14:55:00-07:00,15.6738 +3142,2024-01-11 15:00:00-07:00,16.1366 +3143,2024-01-11 15:05:00-07:00,16.0019 +3144,2024-01-11 15:10:00-07:00,16.452 +3145,2024-01-11 15:15:00-07:00,16.1431 +3146,2024-01-11 15:20:00-07:00,15.8742 +3147,2024-01-11 15:25:00-07:00,17.0469 +3148,2024-01-11 15:30:00-07:00,17.6335 +3149,2024-01-11 15:35:00-07:00,17.9905 +3150,2024-01-11 15:40:00-07:00,17.8594 +3151,2024-01-11 15:45:00-07:00,17.952 +3152,2024-01-11 15:50:00-07:00,18.301 +3153,2024-01-11 15:55:00-07:00,18.6413 +3154,2024-01-11 16:00:00-07:00,18.7726 +3155,2024-01-11 16:05:00-07:00,18.8448 +3156,2024-01-11 16:10:00-07:00,18.768 +3157,2024-01-11 16:15:00-07:00,18.9794 +3158,2024-01-11 16:20:00-07:00,19.0137 +3159,2024-01-11 16:25:00-07:00,19.0514 +3160,2024-01-11 16:30:00-07:00,19.17 +3161,2024-01-11 16:35:00-07:00,19.3136 +3162,2024-01-11 16:40:00-07:00,19.8846 +3163,2024-01-11 16:45:00-07:00,20.8021 +3164,2024-01-11 16:50:00-07:00,25.2158 +3165,2024-01-11 16:55:00-07:00,24.9128 +3166,2024-01-11 17:00:00-07:00,23.4732 +3167,2024-01-11 17:05:00-07:00,25.4518 +3168,2024-01-11 18:15:00-07:00,26.9592 +3169,2024-01-11 18:20:00-07:00,25.6817 +3170,2024-01-11 18:25:00-07:00,19.5837 +3171,2024-01-11 18:30:00-07:00,22.079 +3172,2024-01-11 18:35:00-07:00,21.6729 +3173,2024-01-11 18:40:00-07:00,23.2218 +3174,2024-01-11 18:45:00-07:00,24.9279 +3175,2024-01-11 18:50:00-07:00,25.5248 +3176,2024-01-11 18:55:00-07:00,21.7445 +3177,2024-01-11 19:00:00-07:00,25.929 +3178,2024-01-11 19:05:00-07:00,26.6452 +3179,2024-01-11 19:10:00-07:00,25.8928 +3180,2024-01-11 19:15:00-07:00,22.151 +3181,2024-01-11 19:20:00-07:00,26.9876 +3182,2024-01-11 19:25:00-07:00,27.0144 +3183,2024-01-11 19:30:00-07:00,27.2111 +3184,2024-01-11 19:35:00-07:00,27.3575 +3185,2024-01-11 19:40:00-07:00,27.4717 +3186,2024-01-11 19:45:00-07:00,29.0502 +3187,2024-01-11 19:50:00-07:00,28.7237 +3188,2024-01-11 19:55:00-07:00,30.0572 +3189,2024-01-11 20:00:00-07:00,30.0374 +3190,2024-01-11 20:05:00-07:00,28.4919 +3191,2024-01-11 20:10:00-07:00,28.1337 +3192,2024-01-11 20:15:00-07:00,30.0782 +3193,2024-01-11 20:20:00-07:00,28.5625 +3194,2024-01-11 20:25:00-07:00,28.0003 +3195,2024-01-11 20:30:00-07:00,27.5097 +3196,2024-01-11 20:35:00-07:00,27.0363 +3197,2024-01-11 20:40:00-07:00,26.9863 +3198,2024-01-11 20:45:00-07:00,27.0748 +3199,2024-01-11 20:50:00-07:00,25.8399 +3200,2024-01-11 20:55:00-07:00,27.2888 +3201,2024-01-11 21:00:00-07:00,588.4286 +3202,2024-01-11 21:05:00-07:00,460.0907 +3203,2024-01-11 21:10:00-07:00,543.8218 +3204,2024-01-11 21:15:00-07:00,483.4512 +3205,2024-01-11 21:20:00-07:00,27.1045 +3206,2024-01-11 21:25:00-07:00,25.7161 +3207,2024-01-11 21:30:00-07:00,19.2615 +3208,2024-01-11 21:35:00-07:00,21.5571 +3209,2024-01-11 21:40:00-07:00,21.2759 +3210,2024-01-11 21:45:00-07:00,23.6588 +3211,2024-01-11 21:50:00-07:00,22.0202 +3212,2024-01-11 21:55:00-07:00,21.1423 +3213,2024-01-11 22:00:00-07:00,23.1951 +3214,2024-01-11 22:05:00-07:00,20.7548 +3215,2024-01-11 22:10:00-07:00,25.3135 +3216,2024-01-11 22:15:00-07:00,25.0127 +3217,2024-01-11 22:20:00-07:00,27.7985 +3218,2024-01-11 22:25:00-07:00,26.4787 +3219,2024-01-11 22:30:00-07:00,25.8492 +3220,2024-01-11 22:35:00-07:00,25.8838 +3221,2024-01-11 22:40:00-07:00,25.2522 +3222,2024-01-11 22:45:00-07:00,19.4689 +3223,2024-01-11 22:50:00-07:00,24.2603 +3224,2024-01-11 22:55:00-07:00,19.6652 +3225,2024-01-11 23:00:00-07:00,24.1632 +3226,2024-01-11 23:05:00-07:00,24.1329 +3227,2024-01-11 23:10:00-07:00,24.1541 +3228,2024-01-11 23:15:00-07:00,24.1792 +3229,2024-01-11 23:20:00-07:00,25.5478 +3230,2024-01-11 23:25:00-07:00,24.9123 +3231,2024-01-11 23:30:00-07:00,24.0723 +3232,2024-01-11 23:35:00-07:00,23.1693 +3233,2024-01-11 23:40:00-07:00,23.9317 +3234,2024-01-11 23:45:00-07:00,23.8876 +3235,2024-01-11 23:50:00-07:00,24.2346 +3236,2024-01-11 23:55:00-07:00,24.6862 +3237,2024-01-12 00:00:00-07:00,25.2443 +3238,2024-01-12 00:05:00-07:00,25.39 +3239,2024-01-12 00:10:00-07:00,23.8224 +3240,2024-01-12 00:15:00-07:00,23.0584 +3241,2024-01-12 00:20:00-07:00,23.5914 +3242,2024-01-12 00:25:00-07:00,23.4703 +3243,2024-01-12 00:30:00-07:00,23.2761 +3244,2024-01-12 00:35:00-07:00,22.754 +3245,2024-01-12 00:40:00-07:00,21.9305 +3246,2024-01-12 00:45:00-07:00,21.9014 +3247,2024-01-12 00:50:00-07:00,20.8623 +3248,2024-01-12 00:55:00-07:00,20.712 +3249,2024-01-12 01:00:00-07:00,19.6563 +3250,2024-01-12 01:05:00-07:00,18.9875 +3251,2024-01-12 01:10:00-07:00,18.8792 +3252,2024-01-12 01:15:00-07:00,18.7328 +3253,2024-01-12 01:20:00-07:00,18.577 +3254,2024-01-12 01:25:00-07:00,18.6122 +3255,2024-01-12 01:30:00-07:00,18.546 +3256,2024-01-12 01:35:00-07:00,18.5017 +3257,2024-01-12 01:40:00-07:00,18.4953 +3258,2024-01-12 01:45:00-07:00,18.386 +3259,2024-01-12 01:50:00-07:00,18.251 +3260,2024-01-12 01:55:00-07:00,18.0836 +3261,2024-01-12 02:00:00-07:00,17.9697 +3262,2024-01-12 02:05:00-07:00,17.9894 +3263,2024-01-12 02:10:00-07:00,18.3583 +3264,2024-01-12 02:15:00-07:00,18.7852 +3265,2024-01-12 02:20:00-07:00,18.8068 +3266,2024-01-12 02:25:00-07:00,18.8942 +3267,2024-01-12 02:30:00-07:00,18.8274 +3268,2024-01-12 02:35:00-07:00,18.7428 +3269,2024-01-12 02:40:00-07:00,18.8274 +3270,2024-01-12 02:45:00-07:00,18.8684 +3271,2024-01-12 02:50:00-07:00,18.9738 +3272,2024-01-12 02:55:00-07:00,19.083 +3273,2024-01-12 03:00:00-07:00,19.829 +3274,2024-01-12 03:05:00-07:00,19.2002 +3275,2024-01-12 03:10:00-07:00,19.2046 +3276,2024-01-12 03:15:00-07:00,19.1163 +3277,2024-01-12 03:20:00-07:00,19.2131 +3278,2024-01-12 03:25:00-07:00,19.311 +3279,2024-01-12 03:30:00-07:00,19.5553 +3280,2024-01-12 03:35:00-07:00,19.8643 +3281,2024-01-12 03:40:00-07:00,19.9198 +3282,2024-01-12 03:45:00-07:00,20.0007 +3283,2024-01-12 03:50:00-07:00,20.1516 +3284,2024-01-12 03:55:00-07:00,20.24 +3285,2024-01-12 04:00:00-07:00,20.1087 +3286,2024-01-12 04:05:00-07:00,19.9473 +3287,2024-01-12 04:10:00-07:00,20.0673 +3288,2024-01-12 04:15:00-07:00,19.8969 +3289,2024-01-12 04:20:00-07:00,20.0167 +3290,2024-01-12 04:25:00-07:00,20.2238 +3291,2024-01-12 04:30:00-07:00,20.4143 +3292,2024-01-12 04:35:00-07:00,20.7157 +3293,2024-01-12 04:40:00-07:00,21.3368 +3294,2024-01-12 04:45:00-07:00,20.7712 +3295,2024-01-12 04:50:00-07:00,20.9266 +3296,2024-01-12 04:55:00-07:00,21.5042 +3297,2024-01-12 05:00:00-07:00,21.1558 +3298,2024-01-12 05:05:00-07:00,20.8812 +3299,2024-01-12 05:10:00-07:00,21.1139 +3300,2024-01-12 05:15:00-07:00,20.656 +3301,2024-01-12 05:20:00-07:00,20.3519 +3302,2024-01-12 05:25:00-07:00,20.1076 +3303,2024-01-12 05:30:00-07:00,19.4947 +3304,2024-01-12 05:35:00-07:00,19.4832 +3305,2024-01-12 05:40:00-07:00,19.6235 +3306,2024-01-12 05:45:00-07:00,19.7657 +3307,2024-01-12 05:50:00-07:00,19.9044 +3308,2024-01-12 05:55:00-07:00,20.1259 +3309,2024-01-12 06:00:00-07:00,20.0272 +3310,2024-01-12 06:05:00-07:00,20.1068 +3311,2024-01-12 06:10:00-07:00,19.7326 +3312,2024-01-12 06:15:00-07:00,19.6786 +3313,2024-01-12 06:20:00-07:00,19.5987 +3314,2024-01-12 06:25:00-07:00,19.5555 +3315,2024-01-12 06:30:00-07:00,19.7523 +3316,2024-01-12 06:35:00-07:00,20.2054 +3317,2024-01-12 06:40:00-07:00,20.2252 +3318,2024-01-12 06:45:00-07:00,20.6005 +3319,2024-01-12 06:50:00-07:00,20.8282 +3320,2024-01-12 06:55:00-07:00,22.6729 +3321,2024-01-12 07:00:00-07:00,32.5973 +3322,2024-01-12 07:05:00-07:00,21.3464 +3323,2024-01-12 07:10:00-07:00,25.7902 +3324,2024-01-12 07:15:00-07:00,25.0723 +3325,2024-01-12 07:20:00-07:00,27.6152 +3326,2024-01-12 07:25:00-07:00,27.1284 +3327,2024-01-12 07:30:00-07:00,27.6482 +3328,2024-01-12 07:35:00-07:00,24.1371 +3329,2024-01-12 07:40:00-07:00,24.1827 +3330,2024-01-12 07:45:00-07:00,24.4414 +3331,2024-01-12 07:50:00-07:00,23.6268 +3332,2024-01-12 07:55:00-07:00,23.6959 +3333,2024-01-12 08:00:00-07:00,25.5143 +3334,2024-01-12 08:05:00-07:00,22.3892 +3335,2024-01-12 08:10:00-07:00,22.1879 +3336,2024-01-12 08:15:00-07:00,21.4864 +3337,2024-01-12 08:20:00-07:00,19.5594 +3338,2024-01-12 08:25:00-07:00,19.1015 +3339,2024-01-12 08:30:00-07:00,19.1699 +3340,2024-01-12 08:35:00-07:00,18.5476 +3341,2024-01-12 08:40:00-07:00,18.3142 +3342,2024-01-12 08:45:00-07:00,16.9839 +3343,2024-01-12 08:50:00-07:00,17.11 +3344,2024-01-12 08:55:00-07:00,17.1762 +3345,2024-01-12 09:00:00-07:00,18.6197 +3346,2024-01-12 09:05:00-07:00,17.9122 +3347,2024-01-12 09:10:00-07:00,18.1185 +3348,2024-01-12 09:15:00-07:00,19.7725 +3349,2024-01-12 09:20:00-07:00,20.1436 +3350,2024-01-12 09:25:00-07:00,20.2569 +3351,2024-01-12 09:30:00-07:00,19.001 +3352,2024-01-12 09:35:00-07:00,18.7966 +3353,2024-01-12 09:40:00-07:00,18.7195 +3354,2024-01-12 09:45:00-07:00,18.64 +3355,2024-01-12 09:50:00-07:00,18.735 +3356,2024-01-12 09:55:00-07:00,18.7134 +3357,2024-01-12 10:00:00-07:00,18.9876 +3358,2024-01-12 10:05:00-07:00,19.1684 +3359,2024-01-12 10:10:00-07:00,19.296 +3360,2024-01-12 10:15:00-07:00,19.3901 +3361,2024-01-12 10:20:00-07:00,19.7967 +3362,2024-01-12 10:25:00-07:00,19.3972 +3363,2024-01-12 10:30:00-07:00,19.4652 +3364,2024-01-12 10:35:00-07:00,19.4936 +3365,2024-01-12 10:40:00-07:00,19.536 +3366,2024-01-12 10:45:00-07:00,19.4015 +3367,2024-01-12 10:50:00-07:00,19.078 +3368,2024-01-12 10:55:00-07:00,18.539 +3369,2024-01-12 11:00:00-07:00,18.5797 +3370,2024-01-12 11:05:00-07:00,18.4363 +3371,2024-01-12 11:10:00-07:00,18.4386 +3372,2024-01-12 11:15:00-07:00,31.863 +3373,2024-01-12 11:20:00-07:00,18.1771 +3374,2024-01-12 11:25:00-07:00,36.748 +3375,2024-01-12 11:30:00-07:00,17.7499 +3376,2024-01-12 11:35:00-07:00,17.8827 +3377,2024-01-12 11:40:00-07:00,17.4858 +3378,2024-01-12 11:45:00-07:00,16.7884 +3379,2024-01-12 11:50:00-07:00,16.4587 +3380,2024-01-12 11:55:00-07:00,10.2647 +3381,2024-01-12 12:00:00-07:00,14.733 +3382,2024-01-12 12:05:00-07:00,15.2621 +3383,2024-01-12 12:10:00-07:00,14.694 +3384,2024-01-12 12:15:00-07:00,10.1837 +3385,2024-01-12 12:20:00-07:00,0.2259 +3386,2024-01-12 12:25:00-07:00,0.2256 +3387,2024-01-12 12:30:00-07:00,9.8683 +3388,2024-01-12 12:35:00-07:00,15.1346 +3389,2024-01-12 12:40:00-07:00,0.2259 +3390,2024-01-12 12:45:00-07:00,14.2546 +3391,2024-01-12 12:50:00-07:00,10.1213 +3392,2024-01-12 12:55:00-07:00,10.02 +3393,2024-01-12 13:00:00-07:00,13.9829 +3394,2024-01-12 13:05:00-07:00,10.0385 +3395,2024-01-12 13:10:00-07:00,10.0338 +3396,2024-01-12 13:15:00-07:00,9.9968 +3397,2024-01-12 13:20:00-07:00,14.0568 +3398,2024-01-12 13:25:00-07:00,15.7234 +3399,2024-01-12 13:30:00-07:00,14.1821 +3400,2024-01-12 13:35:00-07:00,14.9522 +3401,2024-01-12 13:40:00-07:00,14.9678 +3402,2024-01-12 13:45:00-07:00,13.6796 +3403,2024-01-12 13:50:00-07:00,14.5395 +3404,2024-01-12 13:55:00-07:00,0.2185 +3405,2024-01-12 14:00:00-07:00,0.2184 +3406,2024-01-12 14:05:00-07:00,0.2158 +3407,2024-01-12 14:10:00-07:00,0.2154 +3408,2024-01-12 14:15:00-07:00,13.9526 +3409,2024-01-12 14:20:00-07:00,0.2155 +3410,2024-01-12 14:25:00-07:00,0.2177 +3411,2024-01-12 14:30:00-07:00,15.8761 +3412,2024-01-12 14:35:00-07:00,0.2166 +3413,2024-01-12 14:40:00-07:00,15.4222 +3414,2024-01-12 14:45:00-07:00,0.2165 +3415,2024-01-12 14:50:00-07:00,15.729 +3416,2024-01-12 14:55:00-07:00,13.2109 +3417,2024-01-12 15:00:00-07:00,0.217 +3418,2024-01-12 15:05:00-07:00,0.218 +3419,2024-01-12 15:10:00-07:00,0.218 +3420,2024-01-12 15:15:00-07:00,0.2186 +3421,2024-01-12 15:20:00-07:00,0.2173 +3422,2024-01-12 15:25:00-07:00,9.6511 +3423,2024-01-12 15:30:00-07:00,15.9471 +3424,2024-01-12 15:35:00-07:00,0.2174 +3425,2024-01-12 15:40:00-07:00,0.2172 +3426,2024-01-12 15:45:00-07:00,17.3401 +3427,2024-01-12 15:50:00-07:00,18.695 +3428,2024-01-12 15:55:00-07:00,19.0234 +3429,2024-01-12 16:00:00-07:00,19.2302 +3430,2024-01-12 16:05:00-07:00,19.244 +3431,2024-01-12 16:10:00-07:00,19.8491 +3432,2024-01-12 16:15:00-07:00,34.8441 +3433,2024-01-12 16:20:00-07:00,23.5139 +3434,2024-01-12 16:25:00-07:00,19.9782 +3435,2024-01-12 16:30:00-07:00,20.6167 +3436,2024-01-12 16:35:00-07:00,21.7079 +3437,2024-01-12 16:40:00-07:00,27.5405 +3438,2024-01-12 16:45:00-07:00,30.2603 +3439,2024-01-12 16:50:00-07:00,36.1361 +3440,2024-01-12 16:55:00-07:00,27.0218 +3441,2024-01-12 17:00:00-07:00,21.9126 +3442,2024-01-12 17:05:00-07:00,25.6069 +3443,2024-01-12 17:10:00-07:00,24.7818 +3444,2024-01-12 17:15:00-07:00,27.6424 +3445,2024-01-12 17:20:00-07:00,27.5241 +3446,2024-01-12 17:25:00-07:00,27.8349 +3447,2024-01-12 17:30:00-07:00,28.0938 +3448,2024-01-12 17:35:00-07:00,30.4901 +3449,2024-01-12 17:40:00-07:00,30.8958 +3450,2024-01-12 17:45:00-07:00,30.3669 +3451,2024-01-12 17:50:00-07:00,30.6003 +3452,2024-01-12 17:55:00-07:00,30.9909 +3453,2024-01-12 18:00:00-07:00,29.5222 +3454,2024-01-12 18:05:00-07:00,28.8475 +3455,2024-01-12 18:10:00-07:00,27.6369 +3456,2024-01-12 18:15:00-07:00,26.9903 +3457,2024-01-12 18:20:00-07:00,21.2702 +3458,2024-01-12 18:25:00-07:00,21.0564 +3459,2024-01-12 18:30:00-07:00,20.4684 +3460,2024-01-12 18:35:00-07:00,20.3123 +3461,2024-01-12 18:40:00-07:00,20.1257 +3462,2024-01-12 18:45:00-07:00,19.839 +3463,2024-01-12 18:50:00-07:00,19.8115 +3464,2024-01-12 18:55:00-07:00,19.5027 +3465,2024-01-12 19:00:00-07:00,39.0067 +3466,2024-01-12 19:05:00-07:00,29.2512 +3467,2024-01-12 19:10:00-07:00,32.0077 +3468,2024-01-12 19:15:00-07:00,27.9001 +3469,2024-01-12 19:20:00-07:00,20.3007 +3470,2024-01-12 19:25:00-07:00,20.9667 +3471,2024-01-12 19:30:00-07:00,21.3695 +3472,2024-01-12 19:35:00-07:00,20.5252 +3473,2024-01-12 19:40:00-07:00,20.1084 +3474,2024-01-12 19:45:00-07:00,19.5134 +3475,2024-01-12 19:50:00-07:00,19.5648 +3476,2024-01-12 19:55:00-07:00,19.9855 +3477,2024-01-12 20:00:00-07:00,20.6041 +3478,2024-01-12 20:05:00-07:00,20.613 +3479,2024-01-12 20:10:00-07:00,19.6561 +3480,2024-01-12 20:15:00-07:00,19.405 +3481,2024-01-12 20:20:00-07:00,19.2166 +3482,2024-01-12 20:25:00-07:00,19.1993 +3483,2024-01-12 20:30:00-07:00,19.2223 +3484,2024-01-12 20:35:00-07:00,19.1918 +3485,2024-01-12 20:40:00-07:00,19.1631 +3486,2024-01-12 20:45:00-07:00,18.9144 +3487,2024-01-12 20:50:00-07:00,19.0553 +3488,2024-01-12 20:55:00-07:00,19.1831 +3489,2024-01-12 21:00:00-07:00,19.5002 +3490,2024-01-12 21:05:00-07:00,19.834 +3491,2024-01-12 21:10:00-07:00,20.3229 +3492,2024-01-12 21:15:00-07:00,20.8522 +3493,2024-01-12 21:20:00-07:00,21.0557 +3494,2024-01-12 21:25:00-07:00,20.8908 +3495,2024-01-12 21:30:00-07:00,19.6876 +3496,2024-01-12 21:35:00-07:00,20.0289 +3497,2024-01-12 21:40:00-07:00,19.8261 +3498,2024-01-12 21:45:00-07:00,20.1405 +3499,2024-01-12 21:50:00-07:00,20.4597 +3500,2024-01-12 21:55:00-07:00,19.575 +3501,2024-01-12 22:00:00-07:00,19.8537 +3502,2024-01-12 22:05:00-07:00,19.4104 +3503,2024-01-12 22:10:00-07:00,19.3904 +3504,2024-01-12 22:15:00-07:00,18.9003 +3505,2024-01-12 22:20:00-07:00,18.8012 +3506,2024-01-12 22:25:00-07:00,18.6097 +3507,2024-01-12 22:30:00-07:00,18.4887 +3508,2024-01-12 22:35:00-07:00,18.4264 +3509,2024-01-12 22:40:00-07:00,18.4552 +3510,2024-01-12 22:45:00-07:00,18.5827 +3511,2024-01-12 22:50:00-07:00,18.5847 +3512,2024-01-12 22:55:00-07:00,18.8934 +3513,2024-01-12 23:00:00-07:00,19.1751 +3514,2024-01-12 23:05:00-07:00,20.9938 +3515,2024-01-12 23:10:00-07:00,24.0246 +3516,2024-01-12 23:15:00-07:00,19.9107 +3517,2024-01-12 23:20:00-07:00,20.9422 +3518,2024-01-12 23:25:00-07:00,20.8397 +3519,2024-01-12 23:30:00-07:00,24.2185 +3520,2024-01-12 23:35:00-07:00,26.103 +3521,2024-01-12 23:40:00-07:00,24.1934 +3522,2024-01-12 23:45:00-07:00,23.5096 +3523,2024-01-12 23:50:00-07:00,24.0563 +3524,2024-01-12 23:55:00-07:00,22.8645 +3525,2024-01-13 00:00:00-07:00,19.8964 +3526,2024-01-13 00:05:00-07:00,19.5376 +3527,2024-01-13 00:10:00-07:00,19.5375 +3528,2024-01-13 00:15:00-07:00,19.2176 +3529,2024-01-13 00:20:00-07:00,18.7999 +3530,2024-01-13 00:25:00-07:00,18.9456 +3531,2024-01-13 00:30:00-07:00,18.8839 +3532,2024-01-13 00:35:00-07:00,18.9481 +3533,2024-01-13 00:40:00-07:00,18.9673 +3534,2024-01-13 00:45:00-07:00,19.4574 +3535,2024-01-13 00:50:00-07:00,19.3921 +3536,2024-01-13 00:55:00-07:00,18.9418 +3537,2024-01-13 01:00:00-07:00,18.6783 +3538,2024-01-13 01:05:00-07:00,18.7159 +3539,2024-01-13 01:10:00-07:00,17.654 +3540,2024-01-13 01:15:00-07:00,16.2162 +3541,2024-01-13 01:20:00-07:00,16.676 +3542,2024-01-13 01:25:00-07:00,17.6949 +3543,2024-01-13 01:30:00-07:00,17.4346 +3544,2024-01-13 01:35:00-07:00,18.2374 +3545,2024-01-13 01:40:00-07:00,17.8031 +3546,2024-01-13 01:45:00-07:00,19.1576 +3547,2024-01-13 01:50:00-07:00,18.7777 +3548,2024-01-13 01:55:00-07:00,18.7888 +3549,2024-01-13 02:00:00-07:00,18.7262 +3550,2024-01-13 02:05:00-07:00,18.6223 +3551,2024-01-13 02:10:00-07:00,33.3447 +3552,2024-01-13 02:15:00-07:00,35.6858 +3553,2024-01-13 02:20:00-07:00,19.1945 +3554,2024-01-13 02:25:00-07:00,19.5352 +3555,2024-01-13 02:30:00-07:00,19.2241 +3556,2024-01-13 02:35:00-07:00,36.2784 +3557,2024-01-13 02:40:00-07:00,34.7605 +3558,2024-01-13 02:45:00-07:00,16.6698 +3559,2024-01-13 02:50:00-07:00,28.8545 +3560,2024-01-13 02:55:00-07:00,35.0379 +3561,2024-01-13 03:00:00-07:00,20.9112 +3562,2024-01-13 03:05:00-07:00,31.9062 +3563,2024-01-13 03:10:00-07:00,0.0 +3564,2024-01-13 03:15:00-07:00,14.6344 +3565,2024-01-13 03:20:00-07:00,17.8942 +3566,2024-01-13 03:25:00-07:00,15.2034 +3567,2024-01-13 03:30:00-07:00,10.0583 +3568,2024-01-13 03:35:00-07:00,16.5503 +3569,2024-01-13 03:40:00-07:00,16.5048 +3570,2024-01-13 03:45:00-07:00,0.0 +3571,2024-01-13 03:50:00-07:00,14.6354 +3572,2024-01-13 03:55:00-07:00,18.6175 +3573,2024-01-13 04:00:00-07:00,16.2193 +3574,2024-01-13 04:05:00-07:00,17.5293 +3575,2024-01-13 04:10:00-07:00,17.5771 +3576,2024-01-13 04:15:00-07:00,16.8531 +3577,2024-01-13 04:20:00-07:00,0.0 +3578,2024-01-13 04:25:00-07:00,15.1694 +3579,2024-01-13 04:30:00-07:00,16.3432 +3580,2024-01-13 04:35:00-07:00,14.6779 +3581,2024-01-13 04:40:00-07:00,23.5715 +3582,2024-01-13 04:45:00-07:00,18.941 +3583,2024-01-13 04:50:00-07:00,19.2108 +3584,2024-01-13 04:55:00-07:00,18.7874 +3585,2024-01-13 05:00:00-07:00,0.0 +3586,2024-01-13 05:05:00-07:00,0.0001 +3587,2024-01-13 05:10:00-07:00,0.0001 +3588,2024-01-13 05:15:00-07:00,0.0001 +3589,2024-01-13 05:20:00-07:00,17.4222 +3590,2024-01-13 05:25:00-07:00,19.0175 +3591,2024-01-13 05:30:00-07:00,20.0388 +3592,2024-01-13 05:35:00-07:00,19.8124 +3593,2024-01-13 05:40:00-07:00,20.0697 +3594,2024-01-13 05:45:00-07:00,20.3123 +3595,2024-01-13 05:50:00-07:00,19.3241 +3596,2024-01-13 05:55:00-07:00,19.0267 +3597,2024-01-13 06:00:00-07:00,17.9843 +3598,2024-01-13 06:05:00-07:00,17.1621 +3599,2024-01-13 06:10:00-07:00,17.494 +3600,2024-01-13 06:15:00-07:00,17.8888 +3601,2024-01-13 06:20:00-07:00,17.6872 +3602,2024-01-13 06:25:00-07:00,17.7439 +3603,2024-01-13 06:30:00-07:00,33.6478 +3604,2024-01-13 06:35:00-07:00,35.8764 +3605,2024-01-13 06:40:00-07:00,35.7741 +3606,2024-01-13 06:45:00-07:00,29.3549 +3607,2024-01-13 06:50:00-07:00,35.4301 +3608,2024-01-13 06:55:00-07:00,18.3902 +3609,2024-01-13 07:00:00-07:00,18.0466 +3610,2024-01-13 07:05:00-07:00,35.7408 +3611,2024-01-13 07:10:00-07:00,36.1731 +3612,2024-01-13 07:15:00-07:00,36.4438 +3613,2024-01-13 07:20:00-07:00,35.9587 +3614,2024-01-13 07:25:00-07:00,18.4887 +3615,2024-01-13 07:30:00-07:00,36.0601 +3616,2024-01-13 07:35:00-07:00,32.0618 +3617,2024-01-13 07:40:00-07:00,33.3195 +3618,2024-01-13 07:45:00-07:00,18.5239 +3619,2024-01-13 07:50:00-07:00,18.5731 +3620,2024-01-13 07:55:00-07:00,18.5368 +3621,2024-01-13 08:00:00-07:00,16.8758 +3622,2024-01-13 08:05:00-07:00,17.285 +3623,2024-01-13 08:10:00-07:00,35.5919 +3624,2024-01-13 08:15:00-07:00,36.1591 +3625,2024-01-13 08:20:00-07:00,18.1293 +3626,2024-01-13 08:25:00-07:00,18.0497 +3627,2024-01-13 08:30:00-07:00,17.9051 +3628,2024-01-13 08:35:00-07:00,33.9098 +3629,2024-01-13 08:40:00-07:00,35.0887 +3630,2024-01-13 08:45:00-07:00,36.4488 +3631,2024-01-13 08:50:00-07:00,17.8869 +3632,2024-01-13 08:55:00-07:00,24.4662 +3633,2024-01-13 09:00:00-07:00,36.5291 +3634,2024-01-13 09:05:00-07:00,18.3039 +3635,2024-01-13 09:10:00-07:00,18.165 +3636,2024-01-13 09:15:00-07:00,18.0466 +3637,2024-01-13 09:20:00-07:00,17.9405 +3638,2024-01-13 09:25:00-07:00,17.8577 +3639,2024-01-13 09:30:00-07:00,17.6749 +3640,2024-01-13 09:35:00-07:00,27.1536 +3641,2024-01-13 09:40:00-07:00,27.5749 +3642,2024-01-13 09:45:00-07:00,32.5613 +3643,2024-01-13 09:50:00-07:00,26.2478 +3644,2024-01-13 09:55:00-07:00,34.9893 +3645,2024-01-13 10:00:00-07:00,25.5092 +3646,2024-01-13 10:05:00-07:00,18.3053 +3647,2024-01-13 10:10:00-07:00,25.686 +3648,2024-01-13 10:15:00-07:00,30.388 +3649,2024-01-13 10:20:00-07:00,18.0197 +3650,2024-01-13 10:25:00-07:00,33.7371 +3651,2024-01-13 10:30:00-07:00,18.4193 +3652,2024-01-13 10:35:00-07:00,24.4884 +3653,2024-01-13 10:40:00-07:00,18.3495 +3654,2024-01-13 10:45:00-07:00,32.7877 +3655,2024-01-13 10:50:00-07:00,17.1231 +3656,2024-01-13 10:55:00-07:00,16.9143 +3657,2024-01-13 11:00:00-07:00,17.0066 +3658,2024-01-13 11:05:00-07:00,16.4852 +3659,2024-01-13 11:10:00-07:00,33.3727 +3660,2024-01-13 11:15:00-07:00,15.7162 +3661,2024-01-13 11:20:00-07:00,15.3077 +3662,2024-01-13 11:25:00-07:00,15.2591 +3663,2024-01-13 11:30:00-07:00,15.1459 +3664,2024-01-13 11:35:00-07:00,15.6718 +3665,2024-01-13 11:40:00-07:00,15.5159 +3666,2024-01-13 11:45:00-07:00,15.2269 +3667,2024-01-13 11:50:00-07:00,15.1694 +3668,2024-01-13 11:55:00-07:00,14.8627 +3669,2024-01-13 12:00:00-07:00,14.4635 +3670,2024-01-13 12:05:00-07:00,14.7284 +3671,2024-01-13 12:10:00-07:00,13.8518 +3672,2024-01-13 12:15:00-07:00,14.5099 +3673,2024-01-13 12:20:00-07:00,31.5318 +3674,2024-01-13 12:25:00-07:00,31.424 +3675,2024-01-13 12:30:00-07:00,14.485 +3676,2024-01-13 12:35:00-07:00,10.1927 +3677,2024-01-13 12:40:00-07:00,0.0001 +3678,2024-01-13 12:45:00-07:00,13.9406 +3679,2024-01-13 12:50:00-07:00,0.0001 +3680,2024-01-13 12:55:00-07:00,0.0001 +3681,2024-01-13 13:00:00-07:00,0.0001 +3682,2024-01-13 13:05:00-07:00,0.0001 +3683,2024-01-13 13:10:00-07:00,0.0001 +3684,2024-01-13 13:15:00-07:00,0.0001 +3685,2024-01-13 13:20:00-07:00,0.0001 +3686,2024-01-13 13:25:00-07:00,0.0001 +3687,2024-01-13 13:30:00-07:00,0.0 +3688,2024-01-13 13:35:00-07:00,0.0001 +3689,2024-01-13 13:40:00-07:00,0.0001 +3690,2024-01-13 13:45:00-07:00,0.0001 +3691,2024-01-13 13:50:00-07:00,0.0001 +3692,2024-01-13 13:55:00-07:00,0.0001 +3693,2024-01-13 14:00:00-07:00,0.0 +3694,2024-01-13 14:05:00-07:00,0.0 +3695,2024-01-13 14:10:00-07:00,0.0 +3696,2024-01-13 14:15:00-07:00,0.0 +3697,2024-01-13 14:20:00-07:00,-1.0312 +3698,2024-01-13 14:25:00-07:00,-38.7371 +3699,2024-01-13 14:30:00-07:00,-26.7144 +3700,2024-01-13 14:35:00-07:00,-2.1733 +3701,2024-01-13 14:40:00-07:00,-2.1593 +3702,2024-01-13 14:45:00-07:00,-1.0319 +3703,2024-01-13 14:50:00-07:00,-2.1702 +3704,2024-01-13 14:55:00-07:00,-1.051 +3705,2024-01-13 15:00:00-07:00,0.0 +3706,2024-01-13 15:05:00-07:00,0.0 +3707,2024-01-13 15:10:00-07:00,0.0001 +3708,2024-01-13 15:15:00-07:00,9.8993 +3709,2024-01-13 15:20:00-07:00,15.2789 +3710,2024-01-13 15:25:00-07:00,15.4042 +3711,2024-01-13 15:30:00-07:00,16.3952 +3712,2024-01-13 15:35:00-07:00,16.401 +3713,2024-01-13 15:40:00-07:00,17.2029 +3714,2024-01-13 15:45:00-07:00,17.3292 +3715,2024-01-13 15:50:00-07:00,17.8545 +3716,2024-01-13 15:55:00-07:00,18.0506 +3717,2024-01-13 16:00:00-07:00,23.9498 +3718,2024-01-13 16:05:00-07:00,34.452 +3719,2024-01-13 16:10:00-07:00,35.6032 +3720,2024-01-13 16:15:00-07:00,33.9905 +3721,2024-01-13 16:20:00-07:00,25.2722 +3722,2024-01-13 16:25:00-07:00,35.7008 +3723,2024-01-13 16:30:00-07:00,71.7382 +3724,2024-01-13 16:35:00-07:00,221.4692 +3725,2024-01-13 16:40:00-07:00,224.9007 +3726,2024-01-13 16:45:00-07:00,157.7666 +3727,2024-01-13 16:50:00-07:00,146.0337 +3728,2024-01-13 16:55:00-07:00,213.1243 +3729,2024-01-13 17:00:00-07:00,193.9274 +3730,2024-01-13 17:05:00-07:00,146.7507 +3731,2024-01-13 17:10:00-07:00,144.2302 +3732,2024-01-13 17:15:00-07:00,129.935 +3733,2024-01-13 17:20:00-07:00,137.9936 +3734,2024-01-13 17:25:00-07:00,143.7042 +3735,2024-01-13 17:30:00-07:00,162.8596 +3736,2024-01-13 17:35:00-07:00,145.663 +3737,2024-01-13 17:40:00-07:00,148.7679 +3738,2024-01-13 17:45:00-07:00,199.7036 +3739,2024-01-13 17:50:00-07:00,146.6439 +3740,2024-01-13 17:55:00-07:00,233.1431 +3741,2024-01-13 18:00:00-07:00,202.2092 +3742,2024-01-13 18:05:00-07:00,162.0844 +3743,2024-01-13 18:10:00-07:00,148.1737 +3744,2024-01-13 18:15:00-07:00,222.2902 +3745,2024-01-13 18:20:00-07:00,206.7306 +3746,2024-01-13 18:25:00-07:00,221.9027 +3747,2024-01-13 18:30:00-07:00,161.2928 +3748,2024-01-13 18:35:00-07:00,153.3939 +3749,2024-01-13 18:40:00-07:00,149.8682 +3750,2024-01-13 18:45:00-07:00,147.4559 +3751,2024-01-13 18:50:00-07:00,154.1537 +3752,2024-01-13 18:55:00-07:00,152.0788 +3753,2024-01-13 19:00:00-07:00,188.6531 +3754,2024-01-13 19:05:00-07:00,222.4115 +3755,2024-01-13 19:10:00-07:00,225.5646 +3756,2024-01-13 19:15:00-07:00,223.8896 +3757,2024-01-13 19:20:00-07:00,209.3716 +3758,2024-01-13 19:25:00-07:00,161.569 +3759,2024-01-13 19:30:00-07:00,166.6613 +3760,2024-01-13 19:35:00-07:00,206.5123 +3761,2024-01-13 19:40:00-07:00,210.0384 +3762,2024-01-13 19:45:00-07:00,211.5657 +3763,2024-01-13 19:50:00-07:00,212.2572 +3764,2024-01-13 19:55:00-07:00,187.5432 +3765,2024-01-13 20:00:00-07:00,147.3053 +3766,2024-01-13 20:05:00-07:00,146.7461 +3767,2024-01-13 20:10:00-07:00,148.6146 +3768,2024-01-13 20:15:00-07:00,149.0235 +3769,2024-01-13 20:20:00-07:00,84.2596 +3770,2024-01-13 20:25:00-07:00,150.9973 +3771,2024-01-13 20:30:00-07:00,151.8421 +3772,2024-01-13 20:35:00-07:00,84.1266 +3773,2024-01-13 20:40:00-07:00,91.5743 +3774,2024-01-13 20:45:00-07:00,95.9986 +3775,2024-01-13 20:50:00-07:00,108.4919 +3776,2024-01-13 20:55:00-07:00,175.5697 +3777,2024-01-13 21:00:00-07:00,176.3423 +3778,2024-01-13 21:05:00-07:00,175.6531 +3779,2024-01-13 21:10:00-07:00,175.8142 +3780,2024-01-13 21:15:00-07:00,606.7448 +3781,2024-01-13 21:20:00-07:00,103.4354 +3782,2024-01-13 21:25:00-07:00,78.9501 +3783,2024-01-13 21:30:00-07:00,74.8543 +3784,2024-01-13 21:35:00-07:00,74.2909 +3785,2024-01-13 21:40:00-07:00,74.0495 +3786,2024-01-13 21:45:00-07:00,73.4385 +3787,2024-01-13 21:50:00-07:00,21.3038 +3788,2024-01-13 21:55:00-07:00,25.035 +3789,2024-01-13 22:00:00-07:00,338.8385 +3790,2024-01-13 22:05:00-07:00,338.4199 +3791,2024-01-13 22:10:00-07:00,340.8435 +3792,2024-01-13 22:15:00-07:00,342.6237 +3793,2024-01-13 22:20:00-07:00,344.1438 +3794,2024-01-13 22:25:00-07:00,270.5648 +3795,2024-01-13 22:30:00-07:00,213.4187 +3796,2024-01-13 22:35:00-07:00,184.8414 +3797,2024-01-13 22:40:00-07:00,163.6095 +3798,2024-01-13 22:45:00-07:00,155.2261 +3799,2024-01-13 22:50:00-07:00,25.3867 +3800,2024-01-13 22:55:00-07:00,24.9922 +3801,2024-01-13 23:00:00-07:00,33.916 +3802,2024-01-13 23:05:00-07:00,124.6052 +3803,2024-01-13 23:10:00-07:00,33.9202 +3804,2024-01-13 23:15:00-07:00,33.7615 +3805,2024-01-13 23:20:00-07:00,30.1375 +3806,2024-01-13 23:25:00-07:00,22.7584 +3807,2024-01-13 23:30:00-07:00,24.3567 +3808,2024-01-13 23:35:00-07:00,28.4835 +3809,2024-01-13 23:40:00-07:00,195.322 +3810,2024-01-13 23:45:00-07:00,25.1568 +3811,2024-01-13 23:50:00-07:00,24.5908 +3812,2024-01-13 23:55:00-07:00,23.4041 +3813,2024-01-14 00:00:00-07:00,23.2556 +3814,2024-01-14 00:05:00-07:00,22.7102 +3815,2024-01-14 00:10:00-07:00,24.7845 +3816,2024-01-14 00:15:00-07:00,35.0749 +3817,2024-01-14 00:20:00-07:00,24.7835 +3818,2024-01-14 00:25:00-07:00,24.2057 +3819,2024-01-14 00:30:00-07:00,22.871 +3820,2024-01-14 00:35:00-07:00,24.2956 +3821,2024-01-14 00:40:00-07:00,32.0436 +3822,2024-01-14 00:45:00-07:00,22.8455 +3823,2024-01-14 00:50:00-07:00,18.9491 +3824,2024-01-14 00:55:00-07:00,20.6007 +3825,2024-01-14 01:00:00-07:00,30.6992 +3826,2024-01-14 01:05:00-07:00,33.1019 +3827,2024-01-14 01:10:00-07:00,144.3274 +3828,2024-01-14 01:15:00-07:00,139.0628 +3829,2024-01-14 01:20:00-07:00,340.4326 +3830,2024-01-14 01:25:00-07:00,153.5173 +3831,2024-01-14 01:30:00-07:00,325.8998 +3832,2024-01-14 01:35:00-07:00,186.4774 +3833,2024-01-14 01:40:00-07:00,222.5524 +3834,2024-01-14 01:45:00-07:00,221.8053 +3835,2024-01-14 01:50:00-07:00,285.5839 +3836,2024-01-14 01:55:00-07:00,247.5606 +3837,2024-01-14 02:00:00-07:00,285.6471 +3838,2024-01-14 02:05:00-07:00,284.9317 +3839,2024-01-14 02:10:00-07:00,263.0126 +3840,2024-01-14 02:15:00-07:00,282.6671 +3841,2024-01-14 02:20:00-07:00,267.4415 +3842,2024-01-14 02:25:00-07:00,286.5613 +3843,2024-01-14 02:30:00-07:00,289.8801 +3844,2024-01-14 02:35:00-07:00,212.2706 +3845,2024-01-14 02:40:00-07:00,227.2455 +3846,2024-01-14 02:45:00-07:00,249.4069 +3847,2024-01-14 02:50:00-07:00,249.3005 +3848,2024-01-14 02:55:00-07:00,250.0682 +3849,2024-01-14 03:00:00-07:00,18.26 +3850,2024-01-14 03:05:00-07:00,33.2963 +3851,2024-01-14 03:10:00-07:00,190.9544 +3852,2024-01-14 03:15:00-07:00,160.0574 +3853,2024-01-14 03:20:00-07:00,158.6877 +3854,2024-01-14 03:25:00-07:00,158.8841 +3855,2024-01-14 03:30:00-07:00,158.9788 +3856,2024-01-14 03:35:00-07:00,158.922 +3857,2024-01-14 03:40:00-07:00,29.2604 +3858,2024-01-14 03:45:00-07:00,34.6952 +3859,2024-01-14 03:50:00-07:00,25.4401 +3860,2024-01-14 03:55:00-07:00,19.1768 +3861,2024-01-14 04:00:00-07:00,19.0132 +3862,2024-01-14 04:05:00-07:00,19.7396 +3863,2024-01-14 04:10:00-07:00,23.9624 +3864,2024-01-14 04:15:00-07:00,222.9774 +3865,2024-01-14 04:20:00-07:00,127.3767 +3866,2024-01-14 04:25:00-07:00,130.4041 +3867,2024-01-14 04:30:00-07:00,131.8009 +3868,2024-01-14 04:35:00-07:00,34.397 +3869,2024-01-14 04:40:00-07:00,38.4799 +3870,2024-01-14 04:45:00-07:00,33.1212 +3871,2024-01-14 04:50:00-07:00,29.1983 +3872,2024-01-14 04:55:00-07:00,33.7427 +3873,2024-01-14 05:00:00-07:00,18.9283 +3874,2024-01-14 05:05:00-07:00,22.1115 +3875,2024-01-14 05:10:00-07:00,24.523 +3876,2024-01-14 05:15:00-07:00,18.9381 +3877,2024-01-14 05:20:00-07:00,24.9764 +3878,2024-01-14 05:25:00-07:00,17.8863 +3879,2024-01-14 05:30:00-07:00,25.9833 +3880,2024-01-14 05:35:00-07:00,18.7522 +3881,2024-01-14 05:40:00-07:00,23.0739 +3882,2024-01-14 05:45:00-07:00,18.3067 +3883,2024-01-14 05:50:00-07:00,23.6413 +3884,2024-01-14 05:55:00-07:00,23.3604 +3885,2024-01-14 06:00:00-07:00,22.9652 +3886,2024-01-14 06:05:00-07:00,33.2998 +3887,2024-01-14 06:10:00-07:00,33.3054 +3888,2024-01-14 06:15:00-07:00,25.4197 +3889,2024-01-14 06:20:00-07:00,25.2164 +3890,2024-01-14 06:25:00-07:00,29.3444 +3891,2024-01-14 06:30:00-07:00,33.6637 +3892,2024-01-14 06:35:00-07:00,137.7196 +3893,2024-01-14 06:40:00-07:00,195.4455 +3894,2024-01-14 06:45:00-07:00,158.7362 +3895,2024-01-14 06:50:00-07:00,138.516 +3896,2024-01-14 06:55:00-07:00,31.9418 +3897,2024-01-14 07:00:00-07:00,32.5558 +3898,2024-01-14 07:05:00-07:00,116.916 +3899,2024-01-14 07:10:00-07:00,140.3458 +3900,2024-01-14 07:15:00-07:00,204.2063 +3901,2024-01-14 07:20:00-07:00,25.2111 +3902,2024-01-14 07:25:00-07:00,116.4422 +3903,2024-01-14 07:30:00-07:00,144.2281 +3904,2024-01-14 07:35:00-07:00,158.2034 +3905,2024-01-14 07:40:00-07:00,169.698 +3906,2024-01-14 07:45:00-07:00,144.7088 +3907,2024-01-14 07:50:00-07:00,135.9004 +3908,2024-01-14 07:55:00-07:00,18.4381 +3909,2024-01-14 08:00:00-07:00,24.9594 +3910,2024-01-14 08:05:00-07:00,39.8209 +3911,2024-01-14 08:10:00-07:00,30.5022 +3912,2024-01-14 08:15:00-07:00,32.9867 +3913,2024-01-14 08:20:00-07:00,23.9663 +3914,2024-01-14 08:25:00-07:00,19.4468 +3915,2024-01-14 08:30:00-07:00,27.8138 +3916,2024-01-14 08:35:00-07:00,29.0669 +3917,2024-01-14 08:40:00-07:00,18.8019 +3918,2024-01-14 08:45:00-07:00,24.0487 +3919,2024-01-14 08:50:00-07:00,17.2642 +3920,2024-01-14 08:55:00-07:00,24.2834 +3921,2024-01-14 09:00:00-07:00,18.1338 +3922,2024-01-14 09:05:00-07:00,22.9424 +3923,2024-01-14 09:10:00-07:00,25.6693 +3924,2024-01-14 09:15:00-07:00,18.0879 +3925,2024-01-14 09:20:00-07:00,18.8401 +3926,2024-01-14 09:25:00-07:00,18.0493 +3927,2024-01-14 09:30:00-07:00,18.0478 +3928,2024-01-14 09:35:00-07:00,24.6282 +3929,2024-01-14 09:40:00-07:00,26.4986 +3930,2024-01-14 09:45:00-07:00,26.0723 +3931,2024-01-14 09:50:00-07:00,25.973 +3932,2024-01-14 09:55:00-07:00,25.8154 +3933,2024-01-14 10:00:00-07:00,58.1197 +3934,2024-01-14 10:05:00-07:00,19.9645 +3935,2024-01-14 10:10:00-07:00,20.314 +3936,2024-01-14 10:15:00-07:00,20.5521 +3937,2024-01-14 10:20:00-07:00,28.9691 +3938,2024-01-14 10:25:00-07:00,34.7777 +3939,2024-01-14 10:30:00-07:00,20.8989 +3940,2024-01-14 10:35:00-07:00,32.9228 +3941,2024-01-14 10:40:00-07:00,30.3253 +3942,2024-01-14 10:45:00-07:00,122.5764 +3943,2024-01-14 10:50:00-07:00,57.8449 +3944,2024-01-14 10:55:00-07:00,21.5398 +3945,2024-01-14 11:00:00-07:00,31.6827 +3946,2024-01-14 11:05:00-07:00,33.6237 +3947,2024-01-14 11:10:00-07:00,168.7366 +3948,2024-01-14 11:15:00-07:00,129.503 +3949,2024-01-14 11:20:00-07:00,122.5163 +3950,2024-01-14 11:25:00-07:00,116.7915 +3951,2024-01-14 11:30:00-07:00,33.6585 +3952,2024-01-14 11:35:00-07:00,32.7447 +3953,2024-01-14 11:40:00-07:00,34.8438 +3954,2024-01-14 11:45:00-07:00,119.1495 +3955,2024-01-14 11:50:00-07:00,116.2574 +3956,2024-01-14 11:55:00-07:00,116.9039 +3957,2024-01-14 12:00:00-07:00,33.8487 +3958,2024-01-14 12:05:00-07:00,33.2909 +3959,2024-01-14 12:10:00-07:00,25.355 +3960,2024-01-14 12:15:00-07:00,25.3489 +3961,2024-01-14 12:20:00-07:00,29.9558 +3962,2024-01-14 12:25:00-07:00,25.2495 +3963,2024-01-14 12:30:00-07:00,22.8899 +3964,2024-01-14 12:35:00-07:00,23.4699 +3965,2024-01-14 12:40:00-07:00,18.9218 +3966,2024-01-14 12:45:00-07:00,32.4711 +3967,2024-01-14 12:50:00-07:00,26.8586 +3968,2024-01-14 12:55:00-07:00,17.631 +3969,2024-01-14 13:00:00-07:00,20.1344 +3970,2024-01-14 13:05:00-07:00,19.0006 +3971,2024-01-14 13:10:00-07:00,32.1919 +3972,2024-01-14 13:15:00-07:00,26.5867 +3973,2024-01-14 13:20:00-07:00,30.3582 +3974,2024-01-14 13:25:00-07:00,31.9379 +3975,2024-01-14 13:30:00-07:00,20.3237 +3976,2024-01-14 13:35:00-07:00,18.2295 +3977,2024-01-14 13:40:00-07:00,18.1447 +3978,2024-01-14 13:45:00-07:00,26.4007 +3979,2024-01-14 13:50:00-07:00,23.328 +3980,2024-01-14 13:55:00-07:00,26.6155 +3981,2024-01-14 14:00:00-07:00,17.9021 +3982,2024-01-14 14:05:00-07:00,23.683 +3983,2024-01-14 14:10:00-07:00,24.9913 +3984,2024-01-14 14:15:00-07:00,17.2503 +3985,2024-01-14 14:20:00-07:00,17.7841 +3986,2024-01-14 14:25:00-07:00,17.6624 +3987,2024-01-14 14:30:00-07:00,17.7468 +3988,2024-01-14 14:35:00-07:00,17.8443 +3989,2024-01-14 14:40:00-07:00,19.5386 +3990,2024-01-14 14:45:00-07:00,29.3525 +3991,2024-01-14 14:50:00-07:00,17.6298 +3992,2024-01-14 14:55:00-07:00,17.8026 +3993,2024-01-14 15:00:00-07:00,17.7587 +3994,2024-01-14 15:05:00-07:00,17.617 +3995,2024-01-14 15:10:00-07:00,28.7833 +3996,2024-01-14 15:15:00-07:00,17.4807 +3997,2024-01-14 15:20:00-07:00,28.4686 +3998,2024-01-14 15:25:00-07:00,57.689 +3999,2024-01-14 15:30:00-07:00,21.1659 +4000,2024-01-14 15:35:00-07:00,32.4715 +4001,2024-01-14 15:40:00-07:00,21.4167 +4002,2024-01-14 15:45:00-07:00,32.9273 +4003,2024-01-14 15:50:00-07:00,33.3048 +4004,2024-01-14 15:55:00-07:00,119.2469 +4005,2024-01-14 16:00:00-07:00,19.0242 +4006,2024-01-14 16:05:00-07:00,19.1919 +4007,2024-01-14 16:10:00-07:00,19.3342 +4008,2024-01-14 16:15:00-07:00,25.2528 +4009,2024-01-14 16:20:00-07:00,30.8298 +4010,2024-01-14 16:25:00-07:00,159.8901 +4011,2024-01-14 16:30:00-07:00,140.8216 +4012,2024-01-14 16:35:00-07:00,132.6146 +4013,2024-01-14 16:40:00-07:00,133.5716 +4014,2024-01-14 16:45:00-07:00,186.9917 +4015,2024-01-14 16:50:00-07:00,181.9732 +4016,2024-01-14 16:55:00-07:00,194.1507 +4017,2024-01-14 17:00:00-07:00,36.2134 +4018,2024-01-14 17:05:00-07:00,78.2016 +4019,2024-01-14 17:10:00-07:00,74.7978 +4020,2024-01-14 17:15:00-07:00,34.0548 +4021,2024-01-14 17:20:00-07:00,24.5704 +4022,2024-01-14 17:25:00-07:00,20.9728 +4023,2024-01-14 17:30:00-07:00,30.7565 +4024,2024-01-14 17:35:00-07:00,31.1836 +4025,2024-01-14 17:40:00-07:00,21.8886 +4026,2024-01-14 17:45:00-07:00,20.2803 +4027,2024-01-14 17:50:00-07:00,21.128 +4028,2024-01-14 17:55:00-07:00,21.0707 +4029,2024-01-14 18:00:00-07:00,54.9585 +4030,2024-01-14 18:05:00-07:00,56.9405 +4031,2024-01-14 18:10:00-07:00,56.6251 +4032,2024-01-14 18:15:00-07:00,20.836 +4033,2024-01-14 18:20:00-07:00,27.0271 +4034,2024-01-14 18:25:00-07:00,20.7283 +4035,2024-01-14 18:30:00-07:00,47.0701 +4036,2024-01-14 18:35:00-07:00,42.5607 +4037,2024-01-14 18:40:00-07:00,39.4145 +4038,2024-01-14 18:45:00-07:00,20.1838 +4039,2024-01-14 18:50:00-07:00,39.052 +4040,2024-01-14 18:55:00-07:00,41.4004 +4041,2024-01-14 19:00:00-07:00,15.4702 +4042,2024-01-14 19:05:00-07:00,16.601 +4043,2024-01-14 19:10:00-07:00,16.3116 +4044,2024-01-14 19:15:00-07:00,16.3764 +4045,2024-01-14 19:20:00-07:00,16.4498 +4046,2024-01-14 19:25:00-07:00,16.1561 +4047,2024-01-14 19:30:00-07:00,16.288 +4048,2024-01-14 19:35:00-07:00,16.2841 +4049,2024-01-14 19:40:00-07:00,16.2414 +4050,2024-01-14 19:45:00-07:00,16.2841 +4051,2024-01-14 19:50:00-07:00,16.0941 +4052,2024-01-14 19:55:00-07:00,16.4488 +4053,2024-01-14 20:00:00-07:00,16.8315 +4054,2024-01-14 20:05:00-07:00,16.7743 +4055,2024-01-14 20:10:00-07:00,16.926 +4056,2024-01-14 20:15:00-07:00,17.0183 +4057,2024-01-14 20:20:00-07:00,16.9704 +4058,2024-01-14 20:25:00-07:00,17.0154 +4059,2024-01-14 20:30:00-07:00,17.0909 +4060,2024-01-14 20:35:00-07:00,17.1495 +4061,2024-01-14 20:40:00-07:00,17.0757 +4062,2024-01-14 20:45:00-07:00,16.9971 +4063,2024-01-14 20:50:00-07:00,17.0307 +4064,2024-01-14 20:55:00-07:00,17.1753 +4065,2024-01-14 21:00:00-07:00,18.1307 +4066,2024-01-14 21:05:00-07:00,17.862 +4067,2024-01-14 21:10:00-07:00,17.7852 +4068,2024-01-14 21:15:00-07:00,17.8089 +4069,2024-01-14 21:20:00-07:00,17.6415 +4070,2024-01-14 21:25:00-07:00,17.5645 +4071,2024-01-14 21:30:00-07:00,17.35 +4072,2024-01-14 21:35:00-07:00,17.1815 +4073,2024-01-14 21:40:00-07:00,16.9754 +4074,2024-01-14 21:45:00-07:00,16.7172 +4075,2024-01-14 21:50:00-07:00,16.5192 +4076,2024-01-14 21:55:00-07:00,16.2622 +4077,2024-01-14 22:00:00-07:00,22.7551 +4078,2024-01-14 22:05:00-07:00,23.2107 +4079,2024-01-14 22:10:00-07:00,15.5856 +4080,2024-01-14 22:15:00-07:00,15.3405 +4081,2024-01-14 22:20:00-07:00,15.1691 +4082,2024-01-14 22:25:00-07:00,15.0633 +4083,2024-01-14 22:30:00-07:00,18.8676 +4084,2024-01-14 22:35:00-07:00,20.977 +4085,2024-01-14 22:40:00-07:00,14.6066 +4086,2024-01-14 22:45:00-07:00,10.3556 +4087,2024-01-14 22:50:00-07:00,14.2035 +4088,2024-01-14 22:55:00-07:00,10.4126 +4089,2024-01-14 23:00:00-07:00,14.4927 +4090,2024-01-14 23:05:00-07:00,0.0001 +4091,2024-01-14 23:10:00-07:00,14.3519 +4092,2024-01-14 23:15:00-07:00,14.286 +4093,2024-01-14 23:20:00-07:00,10.2564 +4094,2024-01-14 23:25:00-07:00,0.0116 +4095,2024-01-14 23:30:00-07:00,0.0001 +4096,2024-01-14 23:35:00-07:00,0.0145 +4097,2024-01-14 23:40:00-07:00,0.0094 +4098,2024-01-14 23:45:00-07:00,0.0001 +4099,2024-01-14 23:50:00-07:00,9.9716 +4100,2024-01-14 23:55:00-07:00,9.949 +4101,2024-01-15 00:00:00-07:00,0.0169 +4102,2024-01-15 00:05:00-07:00,19.7297 +4103,2024-01-15 00:10:00-07:00,0.0 +4104,2024-01-15 00:15:00-07:00,0.0001 +4105,2024-01-15 00:20:00-07:00,0.0001 +4106,2024-01-15 00:25:00-07:00,9.7136 +4107,2024-01-15 00:30:00-07:00,9.7524 +4108,2024-01-15 00:35:00-07:00,9.6907 +4109,2024-01-15 00:40:00-07:00,9.7666 +4110,2024-01-15 00:45:00-07:00,14.9679 +4111,2024-01-15 00:50:00-07:00,16.3089 +4112,2024-01-15 00:55:00-07:00,16.5128 +4113,2024-01-15 01:00:00-07:00,16.3722 +4114,2024-01-15 01:05:00-07:00,16.6161 +4115,2024-01-15 01:10:00-07:00,17.0583 +4116,2024-01-15 01:15:00-07:00,17.3849 +4117,2024-01-15 01:20:00-07:00,17.5572 +4118,2024-01-15 01:25:00-07:00,17.793 +4119,2024-01-15 01:30:00-07:00,23.7617 +4120,2024-01-15 01:35:00-07:00,72.0011 +4121,2024-01-15 01:40:00-07:00,167.0967 +4122,2024-01-15 01:45:00-07:00,34.9423 +4123,2024-01-15 01:50:00-07:00,24.6301 +4124,2024-01-15 01:55:00-07:00,17.9022 +4125,2024-01-15 02:00:00-07:00,17.5209 +4126,2024-01-15 02:05:00-07:00,17.3961 +4127,2024-01-15 02:10:00-07:00,25.5815 +4128,2024-01-15 02:15:00-07:00,17.5978 +4129,2024-01-15 02:20:00-07:00,17.6768 +4130,2024-01-15 02:25:00-07:00,23.7831 +4131,2024-01-15 02:30:00-07:00,17.5579 +4132,2024-01-15 02:35:00-07:00,21.5478 +4133,2024-01-15 02:40:00-07:00,17.2666 +4134,2024-01-15 02:45:00-07:00,17.2405 +4135,2024-01-15 02:50:00-07:00,17.2949 +4136,2024-01-15 02:55:00-07:00,26.2059 +4137,2024-01-15 03:00:00-07:00,33.6496 +4138,2024-01-15 03:05:00-07:00,18.0223 +4139,2024-01-15 03:10:00-07:00,22.9026 +4140,2024-01-15 03:15:00-07:00,24.1062 +4141,2024-01-15 03:20:00-07:00,17.1941 +4142,2024-01-15 03:25:00-07:00,20.3277 +4143,2024-01-15 03:30:00-07:00,18.2106 +4144,2024-01-15 03:35:00-07:00,19.9615 +4145,2024-01-15 03:40:00-07:00,22.819 +4146,2024-01-15 03:45:00-07:00,16.8709 +4147,2024-01-15 03:50:00-07:00,23.1013 +4148,2024-01-15 03:55:00-07:00,21.9788 +4149,2024-01-15 04:00:00-07:00,15.8895 +4150,2024-01-15 04:05:00-07:00,15.5997 +4151,2024-01-15 04:10:00-07:00,15.8792 +4152,2024-01-15 04:15:00-07:00,16.41 +4153,2024-01-15 04:20:00-07:00,21.7666 +4154,2024-01-15 04:25:00-07:00,21.7617 +4155,2024-01-15 04:30:00-07:00,26.915 +4156,2024-01-15 04:35:00-07:00,26.6872 +4157,2024-01-15 04:40:00-07:00,16.0318 +4158,2024-01-15 04:45:00-07:00,24.2483 +4159,2024-01-15 04:50:00-07:00,24.4693 +4160,2024-01-15 04:55:00-07:00,24.5477 +4161,2024-01-15 05:00:00-07:00,30.0131 +4162,2024-01-15 05:05:00-07:00,30.2837 +4163,2024-01-15 05:10:00-07:00,16.9554 +4164,2024-01-15 05:15:00-07:00,16.7423 +4165,2024-01-15 05:20:00-07:00,30.4313 +4166,2024-01-15 05:25:00-07:00,16.7547 +4167,2024-01-15 05:30:00-07:00,16.7851 +4168,2024-01-15 05:35:00-07:00,26.2381 +4169,2024-01-15 05:40:00-07:00,23.8245 +4170,2024-01-15 05:45:00-07:00,27.8794 +4171,2024-01-15 05:50:00-07:00,24.9979 +4172,2024-01-15 05:55:00-07:00,25.2311 +4173,2024-01-15 06:00:00-07:00,30.8004 +4174,2024-01-15 06:05:00-07:00,22.3686 +4175,2024-01-15 06:10:00-07:00,24.5374 +4176,2024-01-15 06:15:00-07:00,25.5677 +4177,2024-01-15 06:20:00-07:00,28.0378 +4178,2024-01-15 06:25:00-07:00,17.7238 +4179,2024-01-15 06:30:00-07:00,25.5 +4180,2024-01-15 06:35:00-07:00,17.6143 +4181,2024-01-15 06:40:00-07:00,25.7711 +4182,2024-01-15 06:45:00-07:00,17.5308 +4183,2024-01-15 06:50:00-07:00,17.4731 +4184,2024-01-15 06:55:00-07:00,17.4655 +4185,2024-01-15 07:00:00-07:00,18.059 +4186,2024-01-15 07:05:00-07:00,17.6085 +4187,2024-01-15 07:10:00-07:00,25.2448 +4188,2024-01-15 07:15:00-07:00,17.1737 +4189,2024-01-15 07:20:00-07:00,17.034 +4190,2024-01-15 07:25:00-07:00,17.0133 +4191,2024-01-15 07:30:00-07:00,20.1367 +4192,2024-01-15 07:35:00-07:00,23.2797 +4193,2024-01-15 07:40:00-07:00,16.4518 +4194,2024-01-15 07:45:00-07:00,16.0098 +4195,2024-01-15 07:50:00-07:00,24.5425 +4196,2024-01-15 07:55:00-07:00,10.2763 +4197,2024-01-15 08:00:00-07:00,5.945 +4198,2024-01-15 08:05:00-07:00,5.9328 +4199,2024-01-15 08:10:00-07:00,5.9391 +4200,2024-01-15 08:15:00-07:00,5.9714 +4201,2024-01-15 08:20:00-07:00,5.9072 +4202,2024-01-15 08:25:00-07:00,4.2192 +4203,2024-01-15 08:30:00-07:00,5.8 +4204,2024-01-15 08:35:00-07:00,5.912 +4205,2024-01-15 08:40:00-07:00,5.8854 +4206,2024-01-15 08:45:00-07:00,0.0 +4207,2024-01-15 08:50:00-07:00,0.0281 +4208,2024-01-15 08:55:00-07:00,0.0 +4209,2024-01-15 09:00:00-07:00,0.0359 +4210,2024-01-15 09:05:00-07:00,0.0 +4211,2024-01-15 09:10:00-07:00,10.0255 +4212,2024-01-15 09:15:00-07:00,16.3705 +4213,2024-01-15 09:20:00-07:00,15.9058 +4214,2024-01-15 09:25:00-07:00,15.0662 +4215,2024-01-15 09:30:00-07:00,14.7857 +4216,2024-01-15 09:35:00-07:00,14.9261 +4217,2024-01-15 09:40:00-07:00,21.2408 +4218,2024-01-15 09:45:00-07:00,14.9191 +4219,2024-01-15 09:50:00-07:00,23.8106 +4220,2024-01-15 09:55:00-07:00,16.4697 +4221,2024-01-15 10:00:00-07:00,17.7659 +4222,2024-01-15 10:05:00-07:00,19.225 +4223,2024-01-15 10:10:00-07:00,24.8017 +4224,2024-01-15 10:15:00-07:00,71.4608 +4225,2024-01-15 10:20:00-07:00,19.6305 +4226,2024-01-15 10:25:00-07:00,28.836 +4227,2024-01-15 10:30:00-07:00,17.3306 +4228,2024-01-15 10:35:00-07:00,15.9507 +4229,2024-01-15 10:40:00-07:00,15.9421 +4230,2024-01-15 10:45:00-07:00,24.7827 +4231,2024-01-15 10:50:00-07:00,15.2601 +4232,2024-01-15 10:55:00-07:00,15.5905 +4233,2024-01-15 11:00:00-07:00,15.6222 +4234,2024-01-15 11:05:00-07:00,16.6705 +4235,2024-01-15 11:10:00-07:00,16.9876 +4236,2024-01-15 11:15:00-07:00,19.2726 +4237,2024-01-15 11:20:00-07:00,6.5365 +4238,2024-01-15 11:25:00-07:00,6.5606 +4239,2024-01-15 11:30:00-07:00,6.5706 +4240,2024-01-15 11:35:00-07:00,6.4759 +4241,2024-01-15 11:40:00-07:00,16.4502 +4242,2024-01-15 11:45:00-07:00,6.6016 +4243,2024-01-15 11:50:00-07:00,6.0311 +4244,2024-01-15 11:55:00-07:00,0.0002 +4245,2024-01-15 12:00:00-07:00,5.8418 +4246,2024-01-15 12:05:00-07:00,5.9714 +4247,2024-01-15 12:10:00-07:00,6.1532 +4248,2024-01-15 12:15:00-07:00,14.7666 +4249,2024-01-15 12:20:00-07:00,15.0612 +4250,2024-01-15 12:25:00-07:00,10.0852 +4251,2024-01-15 12:30:00-07:00,21.1071 +4252,2024-01-15 12:35:00-07:00,14.8702 +4253,2024-01-15 12:40:00-07:00,14.7717 +4254,2024-01-15 12:45:00-07:00,10.167 +4255,2024-01-15 12:50:00-07:00,0.0001 +4256,2024-01-15 12:55:00-07:00,0.0001 +4257,2024-01-15 13:00:00-07:00,0.0 +4258,2024-01-15 13:05:00-07:00,0.0001 +4259,2024-01-15 13:10:00-07:00,0.0 +4260,2024-01-15 13:15:00-07:00,0.0001 +4261,2024-01-15 13:20:00-07:00,0.0001 +4262,2024-01-15 13:25:00-07:00,0.0021 +4263,2024-01-15 13:30:00-07:00,10.3009 +4264,2024-01-15 13:35:00-07:00,0.0 +4265,2024-01-15 13:40:00-07:00,0.0001 +4266,2024-01-15 13:45:00-07:00,0.2629 +4267,2024-01-15 13:50:00-07:00,0.0 +4268,2024-01-15 13:55:00-07:00,0.2473 +4269,2024-01-15 14:00:00-07:00,10.7787 +4270,2024-01-15 14:05:00-07:00,0.0287 +4271,2024-01-15 14:10:00-07:00,0.0001 +4272,2024-01-15 14:15:00-07:00,0.0001 +4273,2024-01-15 14:20:00-07:00,0.0001 +4274,2024-01-15 14:25:00-07:00,0.0 +4275,2024-01-15 14:30:00-07:00,0.0 +4276,2024-01-15 14:35:00-07:00,0.0531 +4277,2024-01-15 14:40:00-07:00,0.0001 +4278,2024-01-15 14:45:00-07:00,5.8092 +4279,2024-01-15 14:50:00-07:00,5.1865 +4280,2024-01-15 14:55:00-07:00,0.0024 +4281,2024-01-15 15:00:00-07:00,0.0626 +4282,2024-01-15 15:05:00-07:00,0.0 +4283,2024-01-15 15:10:00-07:00,0.1679 +4284,2024-01-15 15:15:00-07:00,0.3401 +4285,2024-01-15 15:20:00-07:00,13.9445 +4286,2024-01-15 15:25:00-07:00,13.1739 +4287,2024-01-15 15:30:00-07:00,13.8685 +4288,2024-01-15 15:35:00-07:00,13.9366 +4289,2024-01-15 15:40:00-07:00,13.2403 +4290,2024-01-15 15:45:00-07:00,15.7889 +4291,2024-01-15 15:50:00-07:00,18.1727 +4292,2024-01-15 15:55:00-07:00,16.5148 +4293,2024-01-15 16:00:00-07:00,14.1851 +4294,2024-01-15 16:05:00-07:00,15.957 +4295,2024-01-15 16:10:00-07:00,15.3657 +4296,2024-01-15 16:15:00-07:00,15.4514 +4297,2024-01-15 16:20:00-07:00,16.8838 +4298,2024-01-15 16:25:00-07:00,18.5117 +4299,2024-01-15 16:30:00-07:00,34.0938 +4300,2024-01-15 16:35:00-07:00,24.3914 +4301,2024-01-15 16:40:00-07:00,24.298 +4302,2024-01-15 16:45:00-07:00,24.3566 +4303,2024-01-15 16:50:00-07:00,159.1307 +4304,2024-01-15 16:55:00-07:00,159.2954 +4305,2024-01-15 17:00:00-07:00,18.6464 +4306,2024-01-15 17:05:00-07:00,17.7056 +4307,2024-01-15 17:10:00-07:00,18.2412 +4308,2024-01-15 17:15:00-07:00,18.4012 +4309,2024-01-15 17:20:00-07:00,18.5631 +4310,2024-01-15 17:25:00-07:00,18.6608 +4311,2024-01-15 17:30:00-07:00,19.4433 +4312,2024-01-15 17:35:00-07:00,20.3306 +4313,2024-01-15 17:40:00-07:00,20.2507 +4314,2024-01-15 17:45:00-07:00,19.4855 +4315,2024-01-15 17:50:00-07:00,19.5739 +4316,2024-01-15 17:55:00-07:00,18.9813 +4317,2024-01-15 18:00:00-07:00,20.7405 +4318,2024-01-15 18:05:00-07:00,19.8276 +4319,2024-01-15 18:10:00-07:00,18.4702 +4320,2024-01-15 18:15:00-07:00,18.4855 +4321,2024-01-15 18:20:00-07:00,18.3618 +4322,2024-01-15 18:25:00-07:00,18.2843 +4323,2024-01-15 18:30:00-07:00,19.4504 +4324,2024-01-15 18:35:00-07:00,18.7546 +4325,2024-01-15 18:40:00-07:00,18.5387 +4326,2024-01-15 18:45:00-07:00,18.0387 +4327,2024-01-15 18:50:00-07:00,17.9263 +4328,2024-01-15 18:55:00-07:00,17.803 +4329,2024-01-15 19:00:00-07:00,17.777 +4330,2024-01-15 19:05:00-07:00,17.7258 +4331,2024-01-15 19:10:00-07:00,17.6806 +4332,2024-01-15 19:15:00-07:00,17.5229 +4333,2024-01-15 19:20:00-07:00,17.5206 +4334,2024-01-15 19:25:00-07:00,17.5195 +4335,2024-01-15 19:30:00-07:00,17.5189 +4336,2024-01-15 19:35:00-07:00,17.4253 +4337,2024-01-15 19:40:00-07:00,17.6089 +4338,2024-01-15 19:45:00-07:00,17.8191 +4339,2024-01-15 19:50:00-07:00,17.7859 +4340,2024-01-15 19:55:00-07:00,18.048 +4341,2024-01-15 20:00:00-07:00,18.0416 +4342,2024-01-15 20:05:00-07:00,18.0966 +4343,2024-01-15 20:10:00-07:00,18.1435 +4344,2024-01-15 20:15:00-07:00,18.3245 +4345,2024-01-15 20:20:00-07:00,18.5399 +4346,2024-01-15 20:25:00-07:00,18.5385 +4347,2024-01-15 20:30:00-07:00,18.4773 +4348,2024-01-15 20:35:00-07:00,18.4677 +4349,2024-01-15 20:40:00-07:00,18.4178 +4350,2024-01-15 20:45:00-07:00,18.4719 +4351,2024-01-15 20:50:00-07:00,18.5662 +4352,2024-01-15 20:55:00-07:00,19.2552 +4353,2024-01-15 21:00:00-07:00,20.1259 +4354,2024-01-15 21:05:00-07:00,20.989 +4355,2024-01-15 21:10:00-07:00,20.6833 +4356,2024-01-15 21:15:00-07:00,19.4624 +4357,2024-01-15 21:20:00-07:00,19.2011 +4358,2024-01-15 21:25:00-07:00,19.1907 +4359,2024-01-15 21:30:00-07:00,19.3049 +4360,2024-01-15 21:35:00-07:00,19.3108 +4361,2024-01-15 21:40:00-07:00,19.3567 +4362,2024-01-15 21:45:00-07:00,19.3335 +4363,2024-01-15 21:50:00-07:00,19.3906 +4364,2024-01-15 21:55:00-07:00,19.3306 +4365,2024-01-15 22:00:00-07:00,36.3417 +4366,2024-01-15 22:05:00-07:00,39.1961 +4367,2024-01-15 22:10:00-07:00,45.7811 +4368,2024-01-15 22:15:00-07:00,46.4639 +4369,2024-01-15 22:20:00-07:00,111.6762 +4370,2024-01-15 22:25:00-07:00,42.4497 +4371,2024-01-15 22:30:00-07:00,25.8541 +4372,2024-01-15 22:35:00-07:00,26.4801 +4373,2024-01-15 22:40:00-07:00,24.011 +4374,2024-01-15 22:45:00-07:00,21.5342 +4375,2024-01-15 22:50:00-07:00,25.1811 +4376,2024-01-15 22:55:00-07:00,25.6084 +4377,2024-01-15 23:00:00-07:00,37.1757 +4378,2024-01-15 23:05:00-07:00,40.3364 +4379,2024-01-15 23:10:00-07:00,46.0266 +4380,2024-01-15 23:15:00-07:00,114.6715 +4381,2024-01-15 23:20:00-07:00,45.7568 +4382,2024-01-15 23:25:00-07:00,40.3856 +4383,2024-01-15 23:30:00-07:00,37.1154 +4384,2024-01-15 23:35:00-07:00,30.3024 +4385,2024-01-15 23:40:00-07:00,26.0347 +4386,2024-01-15 23:45:00-07:00,23.9499 +4387,2024-01-15 23:50:00-07:00,21.4846 +4388,2024-01-15 23:55:00-07:00,41.3142 +4389,2024-01-16 00:00:00-07:00,118.6189 +4390,2024-01-16 00:05:00-07:00,112.1298 +4391,2024-01-16 00:10:00-07:00,46.9263 +4392,2024-01-16 00:15:00-07:00,43.9478 +4393,2024-01-16 00:20:00-07:00,45.7801 +4394,2024-01-16 00:25:00-07:00,45.7875 +4395,2024-01-16 00:30:00-07:00,109.6114 +4396,2024-01-16 00:35:00-07:00,46.7448 +4397,2024-01-16 00:40:00-07:00,46.0606 +4398,2024-01-16 00:45:00-07:00,47.6243 +4399,2024-01-16 00:50:00-07:00,46.5214 +4400,2024-01-16 00:55:00-07:00,47.7549 +4401,2024-01-16 01:00:00-07:00,47.7182 +4402,2024-01-16 01:05:00-07:00,40.4829 +4403,2024-01-16 01:10:00-07:00,74.9178 +4404,2024-01-16 01:15:00-07:00,42.5181 +4405,2024-01-16 01:20:00-07:00,43.6111 +4406,2024-01-16 01:25:00-07:00,46.3094 +4407,2024-01-16 01:30:00-07:00,47.7501 +4408,2024-01-16 01:35:00-07:00,43.0941 +4409,2024-01-16 01:40:00-07:00,39.7774 +4410,2024-01-16 01:45:00-07:00,24.8066 +4411,2024-01-16 01:50:00-07:00,20.5301 +4412,2024-01-16 01:55:00-07:00,19.747 +4413,2024-01-16 02:00:00-07:00,19.6129 +4414,2024-01-16 02:05:00-07:00,19.4875 +4415,2024-01-16 02:10:00-07:00,19.5088 +4416,2024-01-16 02:15:00-07:00,19.655 +4417,2024-01-16 02:20:00-07:00,19.646 +4418,2024-01-16 02:25:00-07:00,18.9605 +4419,2024-01-16 02:30:00-07:00,18.595 +4420,2024-01-16 02:35:00-07:00,18.0734 +4421,2024-01-16 02:40:00-07:00,17.7184 +4422,2024-01-16 02:45:00-07:00,17.6138 +4423,2024-01-16 02:50:00-07:00,17.5689 +4424,2024-01-16 02:55:00-07:00,17.4245 +4425,2024-01-16 03:00:00-07:00,17.5777 +4426,2024-01-16 03:05:00-07:00,17.4864 +4427,2024-01-16 03:10:00-07:00,17.4335 +4428,2024-01-16 03:15:00-07:00,17.5754 +4429,2024-01-16 03:20:00-07:00,17.5195 +4430,2024-01-16 03:25:00-07:00,17.4668 +4431,2024-01-16 03:30:00-07:00,17.3143 +4432,2024-01-16 03:35:00-07:00,17.3667 +4433,2024-01-16 03:40:00-07:00,17.2691 +4434,2024-01-16 03:45:00-07:00,17.2309 +4435,2024-01-16 03:50:00-07:00,17.1973 +4436,2024-01-16 03:55:00-07:00,17.1889 +4437,2024-01-16 04:00:00-07:00,17.1429 +4438,2024-01-16 04:05:00-07:00,17.0917 +4439,2024-01-16 04:10:00-07:00,16.8652 +4440,2024-01-16 04:15:00-07:00,16.7169 +4441,2024-01-16 04:20:00-07:00,16.6467 +4442,2024-01-16 04:25:00-07:00,16.5747 +4443,2024-01-16 04:30:00-07:00,16.5684 +4444,2024-01-16 04:35:00-07:00,16.5693 +4445,2024-01-16 04:40:00-07:00,16.6621 +4446,2024-01-16 04:45:00-07:00,16.1491 +4447,2024-01-16 04:50:00-07:00,16.2787 +4448,2024-01-16 04:55:00-07:00,16.4784 +4449,2024-01-16 05:00:00-07:00,16.4802 +4450,2024-01-16 05:05:00-07:00,16.1425 +4451,2024-01-16 05:10:00-07:00,14.4564 +4452,2024-01-16 05:15:00-07:00,14.8098 +4453,2024-01-16 05:20:00-07:00,15.4404 +4454,2024-01-16 05:25:00-07:00,15.8481 +4455,2024-01-16 05:30:00-07:00,15.5712 +4456,2024-01-16 05:35:00-07:00,15.9956 +4457,2024-01-16 05:40:00-07:00,16.4372 +4458,2024-01-16 05:45:00-07:00,16.4371 +4459,2024-01-16 05:50:00-07:00,16.8186 +4460,2024-01-16 05:55:00-07:00,16.9902 +4461,2024-01-16 06:00:00-07:00,17.0209 +4462,2024-01-16 06:05:00-07:00,17.1208 +4463,2024-01-16 06:10:00-07:00,17.0587 +4464,2024-01-16 06:15:00-07:00,16.9977 +4465,2024-01-16 06:20:00-07:00,17.0205 +4466,2024-01-16 06:25:00-07:00,17.0912 +4467,2024-01-16 06:30:00-07:00,17.2106 +4468,2024-01-16 06:35:00-07:00,17.5801 +4469,2024-01-16 06:40:00-07:00,17.6433 +4470,2024-01-16 06:45:00-07:00,18.6628 +4471,2024-01-16 06:50:00-07:00,18.8136 +4472,2024-01-16 06:55:00-07:00,19.4222 +4473,2024-01-16 07:00:00-07:00,19.6237 +4474,2024-01-16 07:05:00-07:00,19.3398 +4475,2024-01-16 07:10:00-07:00,35.9105 +4476,2024-01-16 07:15:00-07:00,34.4828 +4477,2024-01-16 07:20:00-07:00,36.2756 +4478,2024-01-16 07:25:00-07:00,37.0178 +4479,2024-01-16 07:30:00-07:00,31.6536 +4480,2024-01-16 07:35:00-07:00,20.0977 +4481,2024-01-16 07:40:00-07:00,19.9245 +4482,2024-01-16 07:45:00-07:00,19.6507 +4483,2024-01-16 07:50:00-07:00,19.1123 +4484,2024-01-16 07:55:00-07:00,19.3671 +4485,2024-01-16 08:00:00-07:00,19.6338 +4486,2024-01-16 08:05:00-07:00,19.7755 +4487,2024-01-16 08:10:00-07:00,20.5765 +4488,2024-01-16 08:15:00-07:00,20.0122 +4489,2024-01-16 08:20:00-07:00,20.0929 +4490,2024-01-16 08:25:00-07:00,18.8056 +4491,2024-01-16 08:30:00-07:00,18.4369 +4492,2024-01-16 08:35:00-07:00,18.041 +4493,2024-01-16 08:40:00-07:00,17.7583 +4494,2024-01-16 08:45:00-07:00,17.8171 +4495,2024-01-16 08:50:00-07:00,17.9407 +4496,2024-01-16 08:55:00-07:00,16.8943 +4497,2024-01-16 09:00:00-07:00,16.1004 +4498,2024-01-16 09:05:00-07:00,15.0908 +4499,2024-01-16 09:10:00-07:00,15.3417 +4500,2024-01-16 09:15:00-07:00,16.8007 +4501,2024-01-16 09:20:00-07:00,16.8357 +4502,2024-01-16 09:25:00-07:00,16.6014 +4503,2024-01-16 09:30:00-07:00,16.4835 +4504,2024-01-16 09:35:00-07:00,16.3397 +4505,2024-01-16 09:40:00-07:00,16.495 +4506,2024-01-16 09:45:00-07:00,16.729 +4507,2024-01-16 09:50:00-07:00,16.5687 +4508,2024-01-16 09:55:00-07:00,16.7019 +4509,2024-01-16 10:00:00-07:00,16.6275 +4510,2024-01-16 10:05:00-07:00,16.7635 +4511,2024-01-16 10:10:00-07:00,16.779 +4512,2024-01-16 10:15:00-07:00,17.0361 +4513,2024-01-16 10:20:00-07:00,17.6151 +4514,2024-01-16 10:25:00-07:00,17.2162 +4515,2024-01-16 10:30:00-07:00,17.1643 +4516,2024-01-16 10:35:00-07:00,17.479 +4517,2024-01-16 10:40:00-07:00,17.604 +4518,2024-01-16 10:45:00-07:00,18.589 +4519,2024-01-16 10:50:00-07:00,19.1708 +4520,2024-01-16 10:55:00-07:00,19.451 +4521,2024-01-16 11:00:00-07:00,18.3791 +4522,2024-01-16 11:05:00-07:00,18.8982 +4523,2024-01-16 11:10:00-07:00,18.9135 +4524,2024-01-16 11:15:00-07:00,20.809 +4525,2024-01-16 11:20:00-07:00,20.8285 +4526,2024-01-16 11:25:00-07:00,21.298 +4527,2024-01-16 11:30:00-07:00,20.1237 +4528,2024-01-16 11:35:00-07:00,19.9832 +4529,2024-01-16 11:40:00-07:00,18.9468 +4530,2024-01-16 11:45:00-07:00,20.6863 +4531,2024-01-16 11:50:00-07:00,19.6455 +4532,2024-01-16 11:55:00-07:00,19.0462 +4533,2024-01-16 12:00:00-07:00,291.4023 +4534,2024-01-16 12:05:00-07:00,20.2124 +4535,2024-01-16 12:10:00-07:00,21.0865 +4536,2024-01-16 12:15:00-07:00,20.7601 +4537,2024-01-16 12:20:00-07:00,20.8136 +4538,2024-01-16 12:25:00-07:00,23.5496 +4539,2024-01-16 12:30:00-07:00,127.2576 +4540,2024-01-16 12:35:00-07:00,23.6499 +4541,2024-01-16 12:40:00-07:00,23.6815 +4542,2024-01-16 12:45:00-07:00,20.8181 +4543,2024-01-16 12:50:00-07:00,20.7153 +4544,2024-01-16 12:55:00-07:00,20.2534 +4545,2024-01-16 13:00:00-07:00,20.2624 +4546,2024-01-16 13:05:00-07:00,20.2487 +4547,2024-01-16 13:10:00-07:00,17.2679 +4548,2024-01-16 13:15:00-07:00,18.7434 +4549,2024-01-16 13:20:00-07:00,17.745 +4550,2024-01-16 13:25:00-07:00,18.043 +4551,2024-01-16 13:30:00-07:00,18.3807 +4552,2024-01-16 13:35:00-07:00,19.5025 +4553,2024-01-16 13:40:00-07:00,18.8367 +4554,2024-01-16 13:45:00-07:00,17.5134 +4555,2024-01-16 13:50:00-07:00,17.4742 +4556,2024-01-16 13:55:00-07:00,17.3772 +4557,2024-01-16 14:00:00-07:00,17.169 +4558,2024-01-16 14:05:00-07:00,17.1762 +4559,2024-01-16 14:10:00-07:00,17.0183 +4560,2024-01-16 14:15:00-07:00,17.2078 +4561,2024-01-16 14:20:00-07:00,17.0385 +4562,2024-01-16 14:25:00-07:00,17.063 +4563,2024-01-16 14:30:00-07:00,16.7416 +4564,2024-01-16 14:35:00-07:00,16.8844 +4565,2024-01-16 14:40:00-07:00,16.8428 +4566,2024-01-16 14:45:00-07:00,16.9551 +4567,2024-01-16 14:50:00-07:00,16.9701 +4568,2024-01-16 14:55:00-07:00,16.8685 +4569,2024-01-16 15:00:00-07:00,16.8135 +4570,2024-01-16 15:05:00-07:00,16.901 +4571,2024-01-16 15:10:00-07:00,16.9399 +4572,2024-01-16 15:15:00-07:00,18.5898 +4573,2024-01-16 15:20:00-07:00,16.8106 +4574,2024-01-16 15:25:00-07:00,16.7767 +4575,2024-01-16 15:30:00-07:00,18.2719 +4576,2024-01-16 15:35:00-07:00,18.7406 +4577,2024-01-16 15:40:00-07:00,17.6599 +4578,2024-01-16 15:45:00-07:00,19.4084 +4579,2024-01-16 15:50:00-07:00,21.0469 +4580,2024-01-16 15:55:00-07:00,24.3706 +4581,2024-01-16 16:00:00-07:00,21.8415 +4582,2024-01-16 16:05:00-07:00,18.858 +4583,2024-01-16 16:10:00-07:00,18.7713 +4584,2024-01-16 16:15:00-07:00,18.8066 +4585,2024-01-16 16:20:00-07:00,18.6619 +4586,2024-01-16 16:25:00-07:00,18.5271 +4587,2024-01-16 16:30:00-07:00,29.2236 +4588,2024-01-16 16:35:00-07:00,18.7523 +4589,2024-01-16 16:40:00-07:00,23.6517 +4590,2024-01-16 16:45:00-07:00,20.7362 +4591,2024-01-16 16:50:00-07:00,151.547 +4592,2024-01-16 16:55:00-07:00,241.5033 +4593,2024-01-16 17:00:00-07:00,240.972 +4594,2024-01-16 17:05:00-07:00,18.9599 +4595,2024-01-16 17:10:00-07:00,24.4716 +4596,2024-01-16 17:15:00-07:00,18.897 +4597,2024-01-16 17:20:00-07:00,22.4664 +4598,2024-01-16 17:25:00-07:00,23.7122 +4599,2024-01-16 17:30:00-07:00,113.9985 +4600,2024-01-16 17:35:00-07:00,25.674 +4601,2024-01-16 17:40:00-07:00,19.2656 +4602,2024-01-16 17:45:00-07:00,21.8153 +4603,2024-01-16 17:50:00-07:00,23.7692 +4604,2024-01-16 17:55:00-07:00,23.7332 +4605,2024-01-16 18:00:00-07:00,23.669 +4606,2024-01-16 18:05:00-07:00,19.3431 +4607,2024-01-16 18:10:00-07:00,18.4406 +4608,2024-01-16 18:15:00-07:00,18.2404 +4609,2024-01-16 18:20:00-07:00,18.3007 +4610,2024-01-16 18:25:00-07:00,18.1674 +4611,2024-01-16 18:30:00-07:00,18.1829 +4612,2024-01-16 18:35:00-07:00,18.0321 +4613,2024-01-16 18:40:00-07:00,17.9278 +4614,2024-01-16 18:45:00-07:00,17.7177 +4615,2024-01-16 18:50:00-07:00,17.6513 +4616,2024-01-16 18:55:00-07:00,17.8468 +4617,2024-01-16 19:00:00-07:00,17.7968 +4618,2024-01-16 19:05:00-07:00,17.6951 +4619,2024-01-16 19:10:00-07:00,17.0729 +4620,2024-01-16 19:15:00-07:00,16.9748 +4621,2024-01-16 19:20:00-07:00,16.8592 +4622,2024-01-16 19:25:00-07:00,16.7408 +4623,2024-01-16 19:30:00-07:00,16.6384 +4624,2024-01-16 19:35:00-07:00,16.1469 +4625,2024-01-16 19:40:00-07:00,15.4443 +4626,2024-01-16 19:45:00-07:00,16.2785 +4627,2024-01-16 19:50:00-07:00,16.1915 +4628,2024-01-16 19:55:00-07:00,16.4169 +4629,2024-01-16 20:00:00-07:00,16.7802 +4630,2024-01-16 20:05:00-07:00,16.8006 +4631,2024-01-16 20:10:00-07:00,16.8848 +4632,2024-01-16 20:15:00-07:00,16.8062 +4633,2024-01-16 20:20:00-07:00,16.8148 +4634,2024-01-16 20:25:00-07:00,16.8111 +4635,2024-01-16 20:30:00-07:00,17.0542 +4636,2024-01-16 20:35:00-07:00,17.1078 +4637,2024-01-16 20:40:00-07:00,17.0723 +4638,2024-01-16 20:45:00-07:00,16.8691 +4639,2024-01-16 20:50:00-07:00,17.1726 +4640,2024-01-16 20:55:00-07:00,17.6911 +4641,2024-01-16 21:00:00-07:00,57.0968 +4642,2024-01-16 21:05:00-07:00,20.0074 +4643,2024-01-16 21:10:00-07:00,20.0006 +4644,2024-01-16 21:15:00-07:00,20.1891 +4645,2024-01-16 21:20:00-07:00,19.7532 +4646,2024-01-16 21:25:00-07:00,19.6803 +4647,2024-01-16 21:30:00-07:00,19.5853 +4648,2024-01-16 21:35:00-07:00,19.345 +4649,2024-01-16 21:40:00-07:00,18.3917 +4650,2024-01-16 21:45:00-07:00,18.0336 +4651,2024-01-16 21:50:00-07:00,6.4381 +4652,2024-01-16 21:55:00-07:00,6.3633 +4653,2024-01-16 22:00:00-07:00,8.3568 +4654,2024-01-16 22:05:00-07:00,67.0229 +4655,2024-01-16 22:10:00-07:00,9.9886 +4656,2024-01-16 22:15:00-07:00,0.1936 +4657,2024-01-16 22:20:00-07:00,0.1888 +4658,2024-01-16 22:25:00-07:00,0.1911 +4659,2024-01-16 22:30:00-07:00,14.9037 +4660,2024-01-16 22:35:00-07:00,17.0706 +4661,2024-01-16 22:40:00-07:00,17.0033 +4662,2024-01-16 22:45:00-07:00,17.0848 +4663,2024-01-16 22:50:00-07:00,17.0713 +4664,2024-01-16 22:55:00-07:00,17.1111 +4665,2024-01-16 23:00:00-07:00,17.6405 +4666,2024-01-16 23:05:00-07:00,17.6013 +4667,2024-01-16 23:10:00-07:00,17.5133 +4668,2024-01-16 23:15:00-07:00,17.569 +4669,2024-01-16 23:20:00-07:00,17.7832 +4670,2024-01-16 23:25:00-07:00,17.9119 +4671,2024-01-16 23:30:00-07:00,18.0625 +4672,2024-01-16 23:35:00-07:00,18.3049 +4673,2024-01-16 23:40:00-07:00,18.513 +4674,2024-01-16 23:45:00-07:00,18.6789 +4675,2024-01-16 23:50:00-07:00,18.5958 +4676,2024-01-16 23:55:00-07:00,19.1808 +4677,2024-01-17 00:00:00-07:00,20.2984 +4678,2024-01-17 00:05:00-07:00,18.8866 +4679,2024-01-17 00:10:00-07:00,18.7107 +4680,2024-01-17 00:15:00-07:00,18.9955 +4681,2024-01-17 00:20:00-07:00,19.3995 +4682,2024-01-17 00:25:00-07:00,20.1361 +4683,2024-01-17 00:30:00-07:00,20.1659 +4684,2024-01-17 00:35:00-07:00,20.7497 +4685,2024-01-17 00:40:00-07:00,22.4301 +4686,2024-01-17 00:45:00-07:00,104.8851 +4687,2024-01-17 00:50:00-07:00,108.8164 +4688,2024-01-17 00:55:00-07:00,109.5013 +4689,2024-01-17 01:00:00-07:00,126.1919 +4690,2024-01-17 01:05:00-07:00,29.274 +4691,2024-01-17 01:10:00-07:00,25.462 +4692,2024-01-17 01:15:00-07:00,23.7962 +4693,2024-01-17 01:20:00-07:00,23.9915 +4694,2024-01-17 01:25:00-07:00,23.6587 +4695,2024-01-17 01:30:00-07:00,23.8503 +4696,2024-01-17 01:35:00-07:00,23.5755 +4697,2024-01-17 01:40:00-07:00,23.3922 +4698,2024-01-17 01:45:00-07:00,23.7861 +4699,2024-01-17 01:50:00-07:00,23.6146 +4700,2024-01-17 01:55:00-07:00,21.5013 +4701,2024-01-17 02:00:00-07:00,21.4984 +4702,2024-01-17 02:05:00-07:00,22.1682 +4703,2024-01-17 02:10:00-07:00,95.337 +4704,2024-01-17 02:15:00-07:00,23.9693 +4705,2024-01-17 02:20:00-07:00,32.8399 +4706,2024-01-17 02:25:00-07:00,32.9276 +4707,2024-01-17 02:30:00-07:00,22.6849 +4708,2024-01-17 02:35:00-07:00,22.971 +4709,2024-01-17 02:40:00-07:00,22.4811 +4710,2024-01-17 02:45:00-07:00,21.8963 +4711,2024-01-17 02:50:00-07:00,74.2292 +4712,2024-01-17 02:55:00-07:00,78.0028 +4713,2024-01-17 03:00:00-07:00,82.3411 +4714,2024-01-17 03:05:00-07:00,87.6519 +4715,2024-01-17 03:10:00-07:00,86.0304 +4716,2024-01-17 03:15:00-07:00,84.351 +4717,2024-01-17 03:20:00-07:00,548.4666 +4718,2024-01-17 03:25:00-07:00,95.7362 +4719,2024-01-17 03:30:00-07:00,94.5893 +4720,2024-01-17 03:35:00-07:00,97.1382 +4721,2024-01-17 03:40:00-07:00,104.2767 +4722,2024-01-17 03:45:00-07:00,160.528 +4723,2024-01-17 03:50:00-07:00,163.837 +4724,2024-01-17 03:55:00-07:00,162.7816 +4725,2024-01-17 04:00:00-07:00,162.4176 +4726,2024-01-17 04:05:00-07:00,162.9261 +4727,2024-01-17 04:10:00-07:00,168.3711 +4728,2024-01-17 04:15:00-07:00,166.4031 +4729,2024-01-17 04:20:00-07:00,222.7028 +4730,2024-01-17 04:25:00-07:00,163.9129 +4731,2024-01-17 04:30:00-07:00,225.7435 +4732,2024-01-17 04:35:00-07:00,297.523 +4733,2024-01-17 04:40:00-07:00,288.2301 +4734,2024-01-17 04:45:00-07:00,173.1969 +4735,2024-01-17 04:50:00-07:00,179.0593 +4736,2024-01-17 04:55:00-07:00,185.2458 +4737,2024-01-17 05:00:00-07:00,78.8045 +4738,2024-01-17 05:05:00-07:00,108.0426 +4739,2024-01-17 05:10:00-07:00,101.0574 +4740,2024-01-17 05:15:00-07:00,21.0788 +4741,2024-01-17 05:20:00-07:00,190.0381 +4742,2024-01-17 05:25:00-07:00,159.1632 +4743,2024-01-17 05:30:00-07:00,84.2361 +4744,2024-01-17 05:35:00-07:00,248.3421 +4745,2024-01-17 05:40:00-07:00,257.4477 +4746,2024-01-17 05:45:00-07:00,178.4324 +4747,2024-01-17 05:50:00-07:00,104.5673 +4748,2024-01-17 05:55:00-07:00,230.0991 +4749,2024-01-17 06:00:00-07:00,230.0803 +4750,2024-01-17 06:05:00-07:00,210.833 +4751,2024-01-17 06:10:00-07:00,705.74 +4752,2024-01-17 06:15:00-07:00,239.5751 +4753,2024-01-17 06:20:00-07:00,126.8472 +4754,2024-01-17 06:25:00-07:00,125.4635 +4755,2024-01-17 06:30:00-07:00,562.4278 +4756,2024-01-17 06:35:00-07:00,122.2189 +4757,2024-01-17 06:40:00-07:00,120.6882 +4758,2024-01-17 06:45:00-07:00,120.1225 +4759,2024-01-17 06:50:00-07:00,114.5775 +4760,2024-01-17 06:55:00-07:00,216.8634 +4761,2024-01-17 07:00:00-07:00,225.3836 +4762,2024-01-17 07:05:00-07:00,224.5265 +4763,2024-01-17 07:10:00-07:00,225.4978 +4764,2024-01-17 07:15:00-07:00,223.5024 +4765,2024-01-17 07:20:00-07:00,208.666 +4766,2024-01-17 07:25:00-07:00,199.681 +4767,2024-01-17 07:30:00-07:00,26.2882 +4768,2024-01-17 07:35:00-07:00,76.6008 +4769,2024-01-17 07:40:00-07:00,73.0147 +4770,2024-01-17 07:45:00-07:00,70.3097 +4771,2024-01-17 07:50:00-07:00,24.3376 +4772,2024-01-17 07:55:00-07:00,63.5326 +4773,2024-01-17 08:00:00-07:00,39.6041 +4774,2024-01-17 08:05:00-07:00,28.4957 +4775,2024-01-17 08:10:00-07:00,38.179 +4776,2024-01-17 08:15:00-07:00,39.4509 +4777,2024-01-17 08:20:00-07:00,28.0842 +4778,2024-01-17 08:25:00-07:00,27.5068 +4779,2024-01-17 08:30:00-07:00,25.5197 +4780,2024-01-17 08:35:00-07:00,26.5838 +4781,2024-01-17 08:40:00-07:00,26.4692 +4782,2024-01-17 08:45:00-07:00,9.6372 +4783,2024-01-17 08:50:00-07:00,0.2061 +4784,2024-01-17 08:55:00-07:00,21.4036 +4785,2024-01-17 09:00:00-07:00,23.9761 +4786,2024-01-17 09:05:00-07:00,18.9917 +4787,2024-01-17 09:10:00-07:00,26.517 +4788,2024-01-17 09:15:00-07:00,38.2224 +4789,2024-01-17 09:20:00-07:00,27.4953 +4790,2024-01-17 09:25:00-07:00,15.373 +4791,2024-01-17 09:30:00-07:00,27.1854 +4792,2024-01-17 09:35:00-07:00,27.574 +4793,2024-01-17 09:40:00-07:00,25.3824 +4794,2024-01-17 09:45:00-07:00,23.9624 +4795,2024-01-17 09:50:00-07:00,25.2826 +4796,2024-01-17 09:55:00-07:00,26.1829 +4797,2024-01-17 10:00:00-07:00,26.8706 +4798,2024-01-17 10:05:00-07:00,27.2212 +4799,2024-01-17 10:10:00-07:00,28.1985 +4800,2024-01-17 10:15:00-07:00,39.4022 +4801,2024-01-17 10:20:00-07:00,39.0976 +4802,2024-01-17 10:25:00-07:00,30.3101 +4803,2024-01-17 10:30:00-07:00,39.9587 +4804,2024-01-17 10:35:00-07:00,30.347 +4805,2024-01-17 10:40:00-07:00,32.7565 +4806,2024-01-17 10:45:00-07:00,31.3027 +4807,2024-01-17 10:50:00-07:00,32.2192 +4808,2024-01-17 10:55:00-07:00,31.75 +4809,2024-01-17 11:00:00-07:00,32.6755 +4810,2024-01-17 11:05:00-07:00,31.6428 +4811,2024-01-17 11:10:00-07:00,31.7896 +4812,2024-01-17 11:15:00-07:00,33.4238 +4813,2024-01-17 11:20:00-07:00,33.4338 +4814,2024-01-17 11:25:00-07:00,32.4848 +4815,2024-01-17 11:30:00-07:00,32.0037 +4816,2024-01-17 11:35:00-07:00,32.6895 +4817,2024-01-17 11:40:00-07:00,34.0775 +4818,2024-01-17 11:45:00-07:00,39.6401 +4819,2024-01-17 11:50:00-07:00,32.0168 +4820,2024-01-17 11:55:00-07:00,34.3936 +4821,2024-01-17 12:00:00-07:00,39.5187 +4822,2024-01-17 12:05:00-07:00,38.3977 +4823,2024-01-17 12:10:00-07:00,33.198 +4824,2024-01-17 12:15:00-07:00,32.2735 +4825,2024-01-17 12:20:00-07:00,31.741 +4826,2024-01-17 12:25:00-07:00,31.0156 +4827,2024-01-17 12:30:00-07:00,33.3129 +4828,2024-01-17 12:35:00-07:00,32.6344 +4829,2024-01-17 12:40:00-07:00,31.5529 +4830,2024-01-17 12:45:00-07:00,30.6172 +4831,2024-01-17 12:50:00-07:00,32.4425 +4832,2024-01-17 12:55:00-07:00,33.1646 +4833,2024-01-17 13:00:00-07:00,39.0417 +4834,2024-01-17 13:05:00-07:00,40.1585 +4835,2024-01-17 13:10:00-07:00,40.1841 +4836,2024-01-17 13:15:00-07:00,40.3721 +4837,2024-01-17 13:20:00-07:00,40.3688 +4838,2024-01-17 13:25:00-07:00,43.0456 +4839,2024-01-17 13:30:00-07:00,39.6259 +4840,2024-01-17 13:35:00-07:00,32.4584 +4841,2024-01-17 13:40:00-07:00,29.5299 +4842,2024-01-17 13:45:00-07:00,28.2773 +4843,2024-01-17 13:50:00-07:00,28.5192 +4844,2024-01-17 13:55:00-07:00,29.3778 +4845,2024-01-17 14:00:00-07:00,37.4521 +4846,2024-01-17 14:05:00-07:00,39.8151 +4847,2024-01-17 14:10:00-07:00,24.4149 +4848,2024-01-17 14:15:00-07:00,25.481 +4849,2024-01-17 14:20:00-07:00,25.4413 +4850,2024-01-17 14:25:00-07:00,26.355 +4851,2024-01-17 14:30:00-07:00,25.8861 +4852,2024-01-17 14:35:00-07:00,25.4824 +4853,2024-01-17 14:40:00-07:00,25.0937 +4854,2024-01-17 14:45:00-07:00,25.9 +4855,2024-01-17 14:50:00-07:00,26.0077 +4856,2024-01-17 14:55:00-07:00,26.0821 +4857,2024-01-17 15:00:00-07:00,26.3186 +4858,2024-01-17 15:05:00-07:00,26.2659 +4859,2024-01-17 15:10:00-07:00,26.2507 +4860,2024-01-17 15:15:00-07:00,25.7686 +4861,2024-01-17 15:20:00-07:00,25.4552 +4862,2024-01-17 15:25:00-07:00,26.0216 +4863,2024-01-17 15:30:00-07:00,26.289 +4864,2024-01-17 15:35:00-07:00,26.7103 +4865,2024-01-17 15:40:00-07:00,25.3207 +4866,2024-01-17 15:45:00-07:00,26.2021 +4867,2024-01-17 15:50:00-07:00,26.5827 +4868,2024-01-17 15:55:00-07:00,26.95 +4869,2024-01-17 16:00:00-07:00,27.0486 +4870,2024-01-17 16:05:00-07:00,27.6133 +4871,2024-01-17 16:10:00-07:00,28.4109 +4872,2024-01-17 16:15:00-07:00,28.5291 +4873,2024-01-17 16:20:00-07:00,27.8128 +4874,2024-01-17 16:25:00-07:00,36.0905 +4875,2024-01-17 16:30:00-07:00,39.7513 +4876,2024-01-17 16:35:00-07:00,40.5353 +4877,2024-01-17 16:40:00-07:00,42.6303 +4878,2024-01-17 16:45:00-07:00,44.7206 +4879,2024-01-17 16:50:00-07:00,44.9979 +4880,2024-01-17 16:55:00-07:00,45.0866 +4881,2024-01-17 17:00:00-07:00,40.0798 +4882,2024-01-17 17:05:00-07:00,40.2388 +4883,2024-01-17 17:10:00-07:00,28.078 +4884,2024-01-17 17:15:00-07:00,27.3222 +4885,2024-01-17 17:20:00-07:00,26.6964 +4886,2024-01-17 17:25:00-07:00,26.9052 +4887,2024-01-17 17:30:00-07:00,27.009 +4888,2024-01-17 17:35:00-07:00,27.2838 +4889,2024-01-17 17:40:00-07:00,27.2754 +4890,2024-01-17 17:45:00-07:00,26.8366 +4891,2024-01-17 17:50:00-07:00,26.2171 +4892,2024-01-17 17:55:00-07:00,26.6769 +4893,2024-01-17 18:00:00-07:00,26.6696 +4894,2024-01-17 18:05:00-07:00,26.5758 +4895,2024-01-17 18:10:00-07:00,26.6276 +4896,2024-01-17 18:15:00-07:00,26.6683 +4897,2024-01-17 18:20:00-07:00,27.258 +4898,2024-01-17 18:25:00-07:00,27.2932 +4899,2024-01-17 18:30:00-07:00,26.7459 +4900,2024-01-17 18:35:00-07:00,26.3994 +4901,2024-01-17 18:40:00-07:00,27.04 +4902,2024-01-17 18:45:00-07:00,27.2259 +4903,2024-01-17 18:50:00-07:00,26.8508 +4904,2024-01-17 18:55:00-07:00,26.9907 +4905,2024-01-17 19:00:00-07:00,27.2108 +4906,2024-01-17 19:05:00-07:00,27.7313 +4907,2024-01-17 19:10:00-07:00,28.0044 +4908,2024-01-17 19:15:00-07:00,29.0646 +4909,2024-01-17 19:20:00-07:00,29.8591 +4910,2024-01-17 19:25:00-07:00,30.0588 +4911,2024-01-17 19:30:00-07:00,30.0547 +4912,2024-01-17 19:35:00-07:00,30.5036 +4913,2024-01-17 19:40:00-07:00,30.2701 +4914,2024-01-17 19:45:00-07:00,29.8876 +4915,2024-01-17 19:50:00-07:00,30.1106 +4916,2024-01-17 19:55:00-07:00,29.523 +4917,2024-01-17 20:00:00-07:00,23.7885 +4918,2024-01-17 20:05:00-07:00,25.071 +4919,2024-01-17 20:10:00-07:00,27.6362 +4920,2024-01-17 20:15:00-07:00,28.3802 +4921,2024-01-17 20:20:00-07:00,27.9885 +4922,2024-01-17 20:25:00-07:00,27.1798 +4923,2024-01-17 20:30:00-07:00,26.9494 +4924,2024-01-17 20:35:00-07:00,26.999 +4925,2024-01-17 20:40:00-07:00,27.7565 +4926,2024-01-17 20:45:00-07:00,28.4121 +4927,2024-01-17 20:50:00-07:00,27.9694 +4928,2024-01-17 20:55:00-07:00,25.6187 +4929,2024-01-17 21:00:00-07:00,24.8861 +4930,2024-01-17 21:05:00-07:00,26.7546 +4931,2024-01-17 21:10:00-07:00,26.4206 +4932,2024-01-17 21:15:00-07:00,24.171 +4933,2024-01-17 21:20:00-07:00,25.5063 +4934,2024-01-17 21:25:00-07:00,23.7957 +4935,2024-01-17 21:30:00-07:00,23.7059 +4936,2024-01-17 21:35:00-07:00,22.1967 +4937,2024-01-17 21:40:00-07:00,21.9183 +4938,2024-01-17 21:45:00-07:00,10.3651 +4939,2024-01-17 21:50:00-07:00,21.551 +4940,2024-01-17 21:55:00-07:00,24.7088 +4941,2024-01-17 22:00:00-07:00,25.2213 +4942,2024-01-17 22:05:00-07:00,23.5109 +4943,2024-01-17 22:10:00-07:00,26.2191 +4944,2024-01-17 22:15:00-07:00,32.9233 +4945,2024-01-17 22:20:00-07:00,28.7984 +4946,2024-01-17 22:25:00-07:00,28.2509 +4947,2024-01-17 22:30:00-07:00,28.3294 +4948,2024-01-17 22:35:00-07:00,28.3153 +4949,2024-01-17 22:40:00-07:00,28.342 +4950,2024-01-17 22:45:00-07:00,28.4095 +4951,2024-01-17 22:50:00-07:00,28.375 +4952,2024-01-17 22:55:00-07:00,28.2445 +4953,2024-01-17 23:00:00-07:00,28.0651 +4954,2024-01-17 23:05:00-07:00,28.3906 +4955,2024-01-17 23:10:00-07:00,28.4984 +4956,2024-01-17 23:15:00-07:00,28.774 +4957,2024-01-17 23:20:00-07:00,28.8345 +4958,2024-01-17 23:25:00-07:00,29.0659 +4959,2024-01-17 23:30:00-07:00,29.1995 +4960,2024-01-17 23:35:00-07:00,29.1869 +4961,2024-01-17 23:40:00-07:00,29.4637 +4962,2024-01-17 23:45:00-07:00,29.502 +4963,2024-01-17 23:50:00-07:00,30.1066 +4964,2024-01-17 23:55:00-07:00,29.0317 +4965,2024-01-18 00:00:00-07:00,28.808 +4966,2024-01-18 00:05:00-07:00,28.6946 +4967,2024-01-18 00:10:00-07:00,28.443 +4968,2024-01-18 00:15:00-07:00,28.1055 +4969,2024-01-18 00:20:00-07:00,27.7584 +4970,2024-01-18 00:25:00-07:00,27.648 +4971,2024-01-18 00:30:00-07:00,27.6178 +4972,2024-01-18 00:35:00-07:00,27.2607 +4973,2024-01-18 00:40:00-07:00,26.9355 +4974,2024-01-18 00:45:00-07:00,26.8287 +4975,2024-01-18 00:50:00-07:00,26.8244 +4976,2024-01-18 00:55:00-07:00,26.4568 +4977,2024-01-18 01:00:00-07:00,26.101 +4978,2024-01-18 01:05:00-07:00,26.0851 +4979,2024-01-18 01:10:00-07:00,26.0591 +4980,2024-01-18 01:15:00-07:00,26.2926 +4981,2024-01-18 01:20:00-07:00,26.5144 +4982,2024-01-18 01:25:00-07:00,26.5723 +4983,2024-01-18 01:30:00-07:00,26.5609 +4984,2024-01-18 01:35:00-07:00,26.7727 +4985,2024-01-18 01:40:00-07:00,27.138 +4986,2024-01-18 01:45:00-07:00,27.4268 +4987,2024-01-18 01:50:00-07:00,27.6173 +4988,2024-01-18 01:55:00-07:00,27.2712 +4989,2024-01-18 02:00:00-07:00,26.5419 +4990,2024-01-18 02:05:00-07:00,26.3559 +4991,2024-01-18 02:10:00-07:00,26.0448 +4992,2024-01-18 02:15:00-07:00,25.7393 +4993,2024-01-18 02:20:00-07:00,25.525 +4994,2024-01-18 02:25:00-07:00,24.2379 +4995,2024-01-18 02:30:00-07:00,23.7871 +4996,2024-01-18 02:35:00-07:00,24.4246 +4997,2024-01-18 02:40:00-07:00,23.9548 +4998,2024-01-18 02:45:00-07:00,24.1184 +4999,2024-01-18 02:50:00-07:00,24.0356 +5000,2024-01-18 02:55:00-07:00,25.5649 +5001,2024-01-18 03:00:00-07:00,25.9487 +5002,2024-01-18 03:05:00-07:00,25.7859 +5003,2024-01-18 03:10:00-07:00,25.6784 +5004,2024-01-18 03:15:00-07:00,25.7003 +5005,2024-01-18 03:20:00-07:00,25.8564 +5006,2024-01-18 03:25:00-07:00,25.9331 +5007,2024-01-18 03:30:00-07:00,25.8577 +5008,2024-01-18 03:35:00-07:00,25.7138 +5009,2024-01-18 03:40:00-07:00,25.3754 +5010,2024-01-18 03:45:00-07:00,25.3586 +5011,2024-01-18 03:50:00-07:00,25.5065 +5012,2024-01-18 03:55:00-07:00,24.9221 +5013,2024-01-18 04:00:00-07:00,24.7006 +5014,2024-01-18 04:05:00-07:00,24.5694 +5015,2024-01-18 04:10:00-07:00,24.1985 +5016,2024-01-18 04:15:00-07:00,24.1437 +5017,2024-01-18 04:20:00-07:00,24.1548 +5018,2024-01-18 04:25:00-07:00,24.018 +5019,2024-01-18 04:30:00-07:00,24.9235 +5020,2024-01-18 04:35:00-07:00,24.9685 +5021,2024-01-18 04:40:00-07:00,24.9458 +5022,2024-01-18 04:45:00-07:00,24.72 +5023,2024-01-18 04:50:00-07:00,25.5166 +5024,2024-01-18 04:55:00-07:00,25.7106 +5025,2024-01-18 05:00:00-07:00,25.6599 +5026,2024-01-18 05:05:00-07:00,25.8385 +5027,2024-01-18 05:10:00-07:00,25.6702 +5028,2024-01-18 05:15:00-07:00,25.7241 +5029,2024-01-18 05:20:00-07:00,25.6431 +5030,2024-01-18 05:25:00-07:00,25.6544 +5031,2024-01-18 05:30:00-07:00,25.552 +5032,2024-01-18 05:35:00-07:00,25.7131 +5033,2024-01-18 05:40:00-07:00,25.7422 +5034,2024-01-18 05:45:00-07:00,25.6954 +5035,2024-01-18 05:50:00-07:00,26.0235 +5036,2024-01-18 05:55:00-07:00,26.2674 +5037,2024-01-18 06:00:00-07:00,26.5648 +5038,2024-01-18 06:05:00-07:00,26.8007 +5039,2024-01-18 06:10:00-07:00,26.1685 +5040,2024-01-18 06:15:00-07:00,26.0769 +5041,2024-01-18 06:20:00-07:00,25.9178 +5042,2024-01-18 06:25:00-07:00,25.9231 +5043,2024-01-18 06:30:00-07:00,25.8888 +5044,2024-01-18 06:35:00-07:00,25.8837 +5045,2024-01-18 06:40:00-07:00,25.8481 +5046,2024-01-18 06:45:00-07:00,25.9459 +5047,2024-01-18 06:50:00-07:00,25.9173 +5048,2024-01-18 06:55:00-07:00,25.5822 +5049,2024-01-18 07:00:00-07:00,25.2197 +5050,2024-01-18 07:05:00-07:00,24.5368 +5051,2024-01-18 07:10:00-07:00,25.4807 +5052,2024-01-18 07:15:00-07:00,25.6348 +5053,2024-01-18 07:20:00-07:00,25.2551 +5054,2024-01-18 07:25:00-07:00,25.0183 +5055,2024-01-18 07:30:00-07:00,24.8543 +5056,2024-01-18 07:35:00-07:00,23.8477 +5057,2024-01-18 07:40:00-07:00,25.2261 +5058,2024-01-18 07:45:00-07:00,25.6387 +5059,2024-01-18 07:50:00-07:00,25.2588 +5060,2024-01-18 07:55:00-07:00,23.3934 +5061,2024-01-18 08:00:00-07:00,16.0232 +5062,2024-01-18 08:05:00-07:00,16.0004 +5063,2024-01-18 08:10:00-07:00,16.6593 +5064,2024-01-18 08:15:00-07:00,16.2954 +5065,2024-01-18 08:20:00-07:00,17.1528 +5066,2024-01-18 08:25:00-07:00,16.1063 +5067,2024-01-18 08:30:00-07:00,0.2137 +5068,2024-01-18 08:35:00-07:00,0.2237 +5069,2024-01-18 08:40:00-07:00,0.2141 +5070,2024-01-18 08:45:00-07:00,0.2176 +5071,2024-01-18 08:50:00-07:00,10.1106 +5072,2024-01-18 08:55:00-07:00,0.2227 +5073,2024-01-18 09:00:00-07:00,0.2239 +5074,2024-01-18 09:05:00-07:00,9.985 +5075,2024-01-18 09:10:00-07:00,19.7485 +5076,2024-01-18 09:15:00-07:00,18.7718 +5077,2024-01-18 09:20:00-07:00,17.8925 +5078,2024-01-18 09:25:00-07:00,18.1547 +5079,2024-01-18 09:30:00-07:00,17.7293 +5080,2024-01-18 09:35:00-07:00,17.5331 +5081,2024-01-18 09:40:00-07:00,0.2217 +5082,2024-01-18 09:45:00-07:00,0.2287 +5083,2024-01-18 09:50:00-07:00,0.223 +5084,2024-01-18 09:55:00-07:00,0.2228 +5085,2024-01-18 10:00:00-07:00,0.22 +5086,2024-01-18 10:05:00-07:00,0.2217 +5087,2024-01-18 10:10:00-07:00,0.221 +5088,2024-01-18 10:15:00-07:00,0.22 +5089,2024-01-18 10:20:00-07:00,9.1785 +5090,2024-01-18 10:25:00-07:00,9.0503 +5091,2024-01-18 10:30:00-07:00,9.1167 +5092,2024-01-18 10:35:00-07:00,0.2205 +5093,2024-01-18 10:40:00-07:00,0.2211 +5094,2024-01-18 10:45:00-07:00,0.2249 +5095,2024-01-18 10:50:00-07:00,0.2222 +5096,2024-01-18 10:55:00-07:00,12.2719 +5097,2024-01-18 11:00:00-07:00,14.7396 +5098,2024-01-18 11:05:00-07:00,12.3102 +5099,2024-01-18 11:10:00-07:00,12.3217 +5100,2024-01-18 11:15:00-07:00,12.2453 +5101,2024-01-18 11:20:00-07:00,9.4454 +5102,2024-01-18 11:25:00-07:00,0.2185 +5103,2024-01-18 11:30:00-07:00,0.2335 +5104,2024-01-18 11:35:00-07:00,9.0652 +5105,2024-01-18 11:40:00-07:00,18.6107 +5106,2024-01-18 11:45:00-07:00,14.8024 +5107,2024-01-18 11:50:00-07:00,12.287 +5108,2024-01-18 11:55:00-07:00,0.2275 +5109,2024-01-18 12:00:00-07:00,0.2289 +5110,2024-01-18 12:05:00-07:00,0.2176 +5111,2024-01-18 12:10:00-07:00,0.2286 +5112,2024-01-18 12:15:00-07:00,0.2179 +5113,2024-01-18 12:20:00-07:00,9.2813 +5114,2024-01-18 12:25:00-07:00,9.2202 +5115,2024-01-18 12:30:00-07:00,11.9819 +5116,2024-01-18 12:35:00-07:00,9.242 +5117,2024-01-18 12:40:00-07:00,11.9961 +5118,2024-01-18 12:45:00-07:00,9.3293 +5119,2024-01-18 12:50:00-07:00,14.7745 +5120,2024-01-18 12:55:00-07:00,9.3647 +5121,2024-01-18 13:00:00-07:00,11.9239 +5122,2024-01-18 13:05:00-07:00,12.6813 +5123,2024-01-18 13:10:00-07:00,11.6639 +5124,2024-01-18 13:15:00-07:00,11.9222 +5125,2024-01-18 13:20:00-07:00,15.2108 +5126,2024-01-18 13:25:00-07:00,14.0788 +5127,2024-01-18 13:30:00-07:00,12.9543 +5128,2024-01-18 13:35:00-07:00,12.7219 +5129,2024-01-18 13:40:00-07:00,10.0438 +5130,2024-01-18 13:45:00-07:00,12.6286 +5131,2024-01-18 13:50:00-07:00,11.2877 +5132,2024-01-18 13:55:00-07:00,11.9997 +5133,2024-01-18 14:00:00-07:00,12.0574 +5134,2024-01-18 14:05:00-07:00,12.0095 +5135,2024-01-18 14:10:00-07:00,11.7618 +5136,2024-01-18 14:15:00-07:00,12.0716 +5137,2024-01-18 14:20:00-07:00,11.9557 +5138,2024-01-18 14:25:00-07:00,12.1842 +5139,2024-01-18 14:30:00-07:00,12.2696 +5140,2024-01-18 14:35:00-07:00,12.2982 +5141,2024-01-18 14:40:00-07:00,12.3098 +5142,2024-01-18 14:45:00-07:00,12.381 +5143,2024-01-18 14:50:00-07:00,12.5314 +5144,2024-01-18 14:55:00-07:00,11.6445 +5145,2024-01-18 15:00:00-07:00,11.2187 +5146,2024-01-18 15:05:00-07:00,11.5428 +5147,2024-01-18 15:10:00-07:00,11.7297 +5148,2024-01-18 15:15:00-07:00,12.1329 +5149,2024-01-18 15:20:00-07:00,12.3273 +5150,2024-01-18 15:25:00-07:00,12.9 +5151,2024-01-18 15:40:00-07:00,15.196 +5152,2024-01-18 15:45:00-07:00,14.9331 +5153,2024-01-18 15:50:00-07:00,15.3698 +5154,2024-01-18 15:55:00-07:00,14.5558 +5155,2024-01-18 16:00:00-07:00,14.7664 +5156,2024-01-18 16:05:00-07:00,14.2043 +5157,2024-01-18 16:10:00-07:00,13.7867 +5158,2024-01-18 16:15:00-07:00,14.9373 +5159,2024-01-18 16:20:00-07:00,15.6228 +5160,2024-01-18 16:25:00-07:00,14.9316 +5161,2024-01-18 16:30:00-07:00,14.4513 +5162,2024-01-18 16:35:00-07:00,15.0337 +5163,2024-01-18 16:40:00-07:00,15.6106 +5164,2024-01-18 16:45:00-07:00,16.2253 +5165,2024-01-18 16:50:00-07:00,16.9207 +5166,2024-01-18 16:55:00-07:00,19.604 +5167,2024-01-18 17:00:00-07:00,19.5978 +5168,2024-01-18 17:05:00-07:00,19.7819 +5169,2024-01-18 17:10:00-07:00,19.4405 +5170,2024-01-18 17:15:00-07:00,19.3603 +5171,2024-01-18 17:20:00-07:00,19.5073 +5172,2024-01-18 17:25:00-07:00,19.7654 +5173,2024-01-18 17:30:00-07:00,19.9601 +5174,2024-01-18 17:35:00-07:00,20.0392 +5175,2024-01-18 17:40:00-07:00,20.0886 +5176,2024-01-18 17:45:00-07:00,19.984 +5177,2024-01-18 17:50:00-07:00,20.0888 +5178,2024-01-18 17:55:00-07:00,20.0214 +5179,2024-01-18 18:00:00-07:00,19.8068 +5180,2024-01-18 18:05:00-07:00,19.8604 +5181,2024-01-18 18:10:00-07:00,19.8977 +5182,2024-01-18 18:15:00-07:00,19.9341 +5183,2024-01-18 18:20:00-07:00,19.4121 +5184,2024-01-18 18:25:00-07:00,19.3581 +5185,2024-01-18 18:30:00-07:00,18.9535 +5186,2024-01-18 18:35:00-07:00,18.7884 +5187,2024-01-18 18:40:00-07:00,18.8156 +5188,2024-01-18 18:45:00-07:00,18.763 +5189,2024-01-18 18:50:00-07:00,18.6671 +5190,2024-01-18 18:55:00-07:00,18.5506 +5191,2024-01-18 19:00:00-07:00,18.4725 +5192,2024-01-18 19:05:00-07:00,18.3531 +5193,2024-01-18 19:10:00-07:00,18.3847 +5194,2024-01-18 19:15:00-07:00,18.4559 +5195,2024-01-18 19:20:00-07:00,18.5297 +5196,2024-01-18 19:25:00-07:00,18.6582 +5197,2024-01-18 19:30:00-07:00,18.6962 +5198,2024-01-18 19:35:00-07:00,18.6146 +5199,2024-01-18 19:40:00-07:00,18.7389 +5200,2024-01-18 19:45:00-07:00,18.6078 +5201,2024-01-18 19:50:00-07:00,18.4537 +5202,2024-01-18 19:55:00-07:00,18.3556 +5203,2024-01-18 20:00:00-07:00,18.3416 +5204,2024-01-18 20:05:00-07:00,18.338 +5205,2024-01-18 20:10:00-07:00,18.3142 +5206,2024-01-18 20:15:00-07:00,18.28 +5207,2024-01-18 20:20:00-07:00,18.2083 +5208,2024-01-18 20:25:00-07:00,18.17 +5209,2024-01-18 20:30:00-07:00,18.1044 +5210,2024-01-18 20:35:00-07:00,85.4244 +5211,2024-01-18 20:40:00-07:00,20.6777 +5212,2024-01-18 20:45:00-07:00,20.1182 +5213,2024-01-18 20:50:00-07:00,19.6452 +5214,2024-01-18 20:55:00-07:00,18.8799 +5215,2024-01-18 21:00:00-07:00,19.0712 +5216,2024-01-18 21:05:00-07:00,19.2255 +5217,2024-01-18 21:10:00-07:00,19.2914 +5218,2024-01-18 21:15:00-07:00,19.271 +5219,2024-01-18 21:20:00-07:00,19.0846 +5220,2024-01-18 21:25:00-07:00,19.2188 +5221,2024-01-18 21:30:00-07:00,19.4175 +5222,2024-01-18 21:35:00-07:00,19.629 +5223,2024-01-18 21:40:00-07:00,19.6479 +5224,2024-01-18 21:45:00-07:00,19.887 +5225,2024-01-18 21:50:00-07:00,19.9349 +5226,2024-01-18 21:55:00-07:00,19.6392 +5227,2024-01-18 22:00:00-07:00,19.0907 +5228,2024-01-18 22:05:00-07:00,18.8688 +5229,2024-01-18 22:10:00-07:00,18.815 +5230,2024-01-18 22:15:00-07:00,18.8009 +5231,2024-01-18 22:20:00-07:00,18.7433 +5232,2024-01-18 22:25:00-07:00,18.6288 +5233,2024-01-18 22:30:00-07:00,18.959 +5234,2024-01-18 22:35:00-07:00,18.981 +5235,2024-01-18 22:40:00-07:00,18.9735 +5236,2024-01-18 22:45:00-07:00,19.1004 +5237,2024-01-18 22:50:00-07:00,19.2911 +5238,2024-01-18 22:55:00-07:00,19.0739 +5239,2024-01-18 23:00:00-07:00,19.1825 +5240,2024-01-18 23:05:00-07:00,19.5576 +5241,2024-01-18 23:10:00-07:00,19.971 +5242,2024-01-18 23:15:00-07:00,20.1156 +5243,2024-01-18 23:20:00-07:00,20.1821 +5244,2024-01-18 23:25:00-07:00,20.3462 +5245,2024-01-18 23:30:00-07:00,20.489 +5246,2024-01-18 23:35:00-07:00,20.5374 +5247,2024-01-18 23:40:00-07:00,20.5877 +5248,2024-01-18 23:45:00-07:00,20.8364 +5249,2024-01-18 23:50:00-07:00,21.0666 +5250,2024-01-18 23:55:00-07:00,20.4905 +5251,2024-01-19 00:00:00-07:00,19.4866 +5252,2024-01-19 00:05:00-07:00,19.5574 +5253,2024-01-19 00:10:00-07:00,19.868 +5254,2024-01-19 00:15:00-07:00,20.0187 +5255,2024-01-19 00:20:00-07:00,20.7623 +5256,2024-01-19 00:25:00-07:00,20.6027 +5257,2024-01-19 00:30:00-07:00,20.6294 +5258,2024-01-19 00:35:00-07:00,20.9254 +5259,2024-01-19 00:40:00-07:00,21.0642 +5260,2024-01-19 00:45:00-07:00,21.1334 +5261,2024-01-19 00:50:00-07:00,20.9679 +5262,2024-01-19 00:55:00-07:00,20.8256 +5263,2024-01-19 01:00:00-07:00,20.8024 +5264,2024-01-19 01:05:00-07:00,20.5048 +5265,2024-01-19 01:10:00-07:00,20.5135 +5266,2024-01-19 01:15:00-07:00,20.3589 +5267,2024-01-19 01:20:00-07:00,20.3641 +5268,2024-01-19 01:25:00-07:00,20.4863 +5269,2024-01-19 01:30:00-07:00,20.2475 +5270,2024-01-19 01:35:00-07:00,20.2093 +5271,2024-01-19 01:40:00-07:00,20.4868 +5272,2024-01-19 01:45:00-07:00,20.5202 +5273,2024-01-19 01:50:00-07:00,20.3527 +5274,2024-01-19 01:55:00-07:00,20.6385 +5275,2024-01-19 02:00:00-07:00,21.0696 +5276,2024-01-19 02:05:00-07:00,21.0818 +5277,2024-01-19 02:10:00-07:00,21.1827 +5278,2024-01-19 02:15:00-07:00,21.5326 +5279,2024-01-19 02:20:00-07:00,22.4101 +5280,2024-01-19 02:25:00-07:00,22.3295 +5281,2024-01-19 02:30:00-07:00,22.8747 +5282,2024-01-19 02:35:00-07:00,22.9041 +5283,2024-01-19 02:40:00-07:00,23.5683 +5284,2024-01-19 02:45:00-07:00,23.876 +5285,2024-01-19 02:50:00-07:00,24.4797 +5286,2024-01-19 02:55:00-07:00,23.6896 +5287,2024-01-19 03:00:00-07:00,22.9157 +5288,2024-01-19 03:05:00-07:00,23.0979 +5289,2024-01-19 03:10:00-07:00,23.1003 +5290,2024-01-19 03:15:00-07:00,22.8464 +5291,2024-01-19 03:20:00-07:00,22.9988 +5292,2024-01-19 03:25:00-07:00,23.1792 +5293,2024-01-19 03:30:00-07:00,23.8065 +5294,2024-01-19 03:35:00-07:00,23.6548 +5295,2024-01-19 03:40:00-07:00,23.7418 +5296,2024-01-19 03:45:00-07:00,23.6155 +5297,2024-01-19 03:50:00-07:00,23.7669 +5298,2024-01-19 03:55:00-07:00,24.4304 +5299,2024-01-19 04:00:00-07:00,24.9114 +5300,2024-01-19 04:05:00-07:00,24.6348 +5301,2024-01-19 04:10:00-07:00,23.4767 +5302,2024-01-19 04:15:00-07:00,21.8173 +5303,2024-01-19 04:20:00-07:00,22.3727 +5304,2024-01-19 04:25:00-07:00,21.8288 +5305,2024-01-19 04:30:00-07:00,21.7803 +5306,2024-01-19 04:35:00-07:00,22.1213 +5307,2024-01-19 04:40:00-07:00,21.9723 +5308,2024-01-19 04:45:00-07:00,22.4519 +5309,2024-01-19 04:50:00-07:00,23.0361 +5310,2024-01-19 04:55:00-07:00,23.8477 +5311,2024-01-19 05:00:00-07:00,19.5436 +5312,2024-01-19 05:05:00-07:00,21.4254 +5313,2024-01-19 05:10:00-07:00,21.4575 +5314,2024-01-19 05:15:00-07:00,21.1621 +5315,2024-01-19 05:20:00-07:00,21.6088 +5316,2024-01-19 05:25:00-07:00,22.0359 +5317,2024-01-19 05:30:00-07:00,23.0565 +5318,2024-01-19 05:35:00-07:00,22.6509 +5319,2024-01-19 05:40:00-07:00,23.1041 +5320,2024-01-19 05:45:00-07:00,23.2117 +5321,2024-01-19 05:50:00-07:00,23.2572 +5322,2024-01-19 05:55:00-07:00,23.6288 +5323,2024-01-19 06:00:00-07:00,31.4663 +5324,2024-01-19 06:05:00-07:00,26.241 +5325,2024-01-19 06:10:00-07:00,26.5561 +5326,2024-01-19 06:15:00-07:00,26.5272 +5327,2024-01-19 06:20:00-07:00,27.5461 +5328,2024-01-19 06:25:00-07:00,30.0694 +5329,2024-01-19 06:30:00-07:00,33.4683 +5330,2024-01-19 06:35:00-07:00,152.4208 +5331,2024-01-19 06:40:00-07:00,61.7127 +5332,2024-01-19 06:45:00-07:00,66.1761 +5333,2024-01-19 06:50:00-07:00,66.1462 +5334,2024-01-19 06:55:00-07:00,66.1381 +5335,2024-01-19 07:00:00-07:00,66.1673 +5336,2024-01-19 07:05:00-07:00,66.2572 +5337,2024-01-19 07:10:00-07:00,66.2069 +5338,2024-01-19 07:15:00-07:00,66.2254 +5339,2024-01-19 07:20:00-07:00,56.9533 +5340,2024-01-19 07:25:00-07:00,57.9741 +5341,2024-01-19 07:30:00-07:00,66.2407 +5342,2024-01-19 07:35:00-07:00,66.2126 +5343,2024-01-19 07:40:00-07:00,66.2272 +5344,2024-01-19 07:45:00-07:00,66.2272 +5345,2024-01-19 07:50:00-07:00,66.1039 +5346,2024-01-19 07:55:00-07:00,66.1098 +5347,2024-01-19 08:00:00-07:00,46.3789 +5348,2024-01-19 08:05:00-07:00,46.4018 +5349,2024-01-19 08:10:00-07:00,46.4034 +5350,2024-01-19 08:15:00-07:00,46.4102 +5351,2024-01-19 08:20:00-07:00,46.4166 +5352,2024-01-19 08:25:00-07:00,46.4067 +5353,2024-01-19 08:30:00-07:00,46.4588 +5354,2024-01-19 08:35:00-07:00,46.442 +5355,2024-01-19 08:40:00-07:00,649.1205 +5356,2024-01-19 08:45:00-07:00,37.7924 +5357,2024-01-19 08:50:00-07:00,39.6566 +5358,2024-01-19 08:55:00-07:00,47.0504 +5359,2024-01-19 09:00:00-07:00,28.0682 +5360,2024-01-19 09:05:00-07:00,28.955 +5361,2024-01-19 09:10:00-07:00,30.9579 +5362,2024-01-19 09:15:00-07:00,49.9536 +5363,2024-01-19 09:20:00-07:00,31.1888 +5364,2024-01-19 09:25:00-07:00,50.0878 +5365,2024-01-19 09:30:00-07:00,31.1581 +5366,2024-01-19 09:35:00-07:00,29.8434 +5367,2024-01-19 09:40:00-07:00,27.5768 +5368,2024-01-19 09:45:00-07:00,24.8601 +5369,2024-01-19 09:50:00-07:00,36.8298 +5370,2024-01-19 09:55:00-07:00,25.0816 +5371,2024-01-19 10:00:00-07:00,43.1691 +5372,2024-01-19 10:05:00-07:00,41.3591 +5373,2024-01-19 10:10:00-07:00,30.0478 +5374,2024-01-19 10:15:00-07:00,43.4547 +5375,2024-01-19 10:20:00-07:00,47.3764 +5376,2024-01-19 10:25:00-07:00,46.8512 +5377,2024-01-19 10:30:00-07:00,40.4606 +5378,2024-01-19 10:35:00-07:00,28.5707 +5379,2024-01-19 10:40:00-07:00,28.5006 +5380,2024-01-19 10:45:00-07:00,28.2488 +5381,2024-01-19 10:50:00-07:00,28.0223 +5382,2024-01-19 10:55:00-07:00,27.9263 +5383,2024-01-19 11:00:00-07:00,28.1472 +5384,2024-01-19 11:05:00-07:00,27.5736 +5385,2024-01-19 11:10:00-07:00,25.2112 +5386,2024-01-19 11:15:00-07:00,26.3223 +5387,2024-01-19 11:20:00-07:00,27.4949 +5388,2024-01-19 11:25:00-07:00,26.1416 +5389,2024-01-19 11:30:00-07:00,25.3344 +5390,2024-01-19 11:35:00-07:00,26.4206 +5391,2024-01-19 11:40:00-07:00,24.9576 +5392,2024-01-19 11:45:00-07:00,24.0512 +5393,2024-01-19 11:50:00-07:00,24.3644 +5394,2024-01-19 11:55:00-07:00,21.7907 +5395,2024-01-19 12:00:00-07:00,23.7365 +5396,2024-01-19 12:05:00-07:00,24.1828 +5397,2024-01-19 12:10:00-07:00,23.2465 +5398,2024-01-19 12:15:00-07:00,21.8759 +5399,2024-01-19 12:20:00-07:00,21.8529 +5400,2024-01-19 12:25:00-07:00,21.7922 +5401,2024-01-19 12:30:00-07:00,21.8874 +5402,2024-01-19 12:35:00-07:00,23.4246 +5403,2024-01-19 12:40:00-07:00,23.5163 +5404,2024-01-19 12:45:00-07:00,24.0714 +5405,2024-01-19 12:50:00-07:00,22.7621 +5406,2024-01-19 12:55:00-07:00,23.4518 +5407,2024-01-19 13:00:00-07:00,24.0102 +5408,2024-01-19 13:05:00-07:00,23.3249 +5409,2024-01-19 13:10:00-07:00,21.9842 +5410,2024-01-19 13:15:00-07:00,22.937 +5411,2024-01-19 13:20:00-07:00,22.4815 +5412,2024-01-19 13:25:00-07:00,23.4592 +5413,2024-01-19 13:30:00-07:00,23.9454 +5414,2024-01-19 13:35:00-07:00,23.9253 +5415,2024-01-19 13:40:00-07:00,23.9238 +5416,2024-01-19 13:45:00-07:00,23.7078 +5417,2024-01-19 13:50:00-07:00,23.0793 +5418,2024-01-19 13:55:00-07:00,23.4161 +5419,2024-01-19 14:00:00-07:00,23.4929 +5420,2024-01-19 14:05:00-07:00,23.4926 +5421,2024-01-19 14:10:00-07:00,23.6423 +5422,2024-01-19 14:15:00-07:00,23.3189 +5423,2024-01-19 14:20:00-07:00,21.9902 +5424,2024-01-19 14:25:00-07:00,21.8088 +5425,2024-01-19 14:30:00-07:00,22.0598 +5426,2024-01-19 14:35:00-07:00,21.8226 +5427,2024-01-19 14:40:00-07:00,22.6311 +5428,2024-01-19 14:45:00-07:00,20.0723 +5429,2024-01-19 14:50:00-07:00,20.7958 +5430,2024-01-19 14:55:00-07:00,20.5122 +5431,2024-01-19 15:00:00-07:00,20.4801 +5432,2024-01-19 15:05:00-07:00,21.0897 +5433,2024-01-19 15:10:00-07:00,21.7547 +5434,2024-01-19 15:15:00-07:00,27.4309 +5435,2024-01-19 15:20:00-07:00,25.8458 +5436,2024-01-19 15:25:00-07:00,24.1382 +5437,2024-01-19 15:30:00-07:00,23.8801 +5438,2024-01-19 15:35:00-07:00,22.8675 +5439,2024-01-19 15:40:00-07:00,20.0685 +5440,2024-01-19 15:45:00-07:00,22.8652 +5441,2024-01-19 15:50:00-07:00,23.7403 +5442,2024-01-19 15:55:00-07:00,25.2575 +5443,2024-01-19 16:00:00-07:00,23.3004 +5444,2024-01-19 16:05:00-07:00,23.3422 +5445,2024-01-19 16:10:00-07:00,20.7855 +5446,2024-01-19 16:15:00-07:00,21.8113 +5447,2024-01-19 16:20:00-07:00,24.1693 +5448,2024-01-19 16:25:00-07:00,23.4674 +5449,2024-01-19 16:30:00-07:00,25.1003 +5450,2024-01-19 16:35:00-07:00,26.189 +5451,2024-01-19 16:40:00-07:00,28.1375 +5452,2024-01-19 16:45:00-07:00,28.3461 +5453,2024-01-19 16:50:00-07:00,29.755 +5454,2024-01-19 16:55:00-07:00,32.7014 +5455,2024-01-19 17:00:00-07:00,28.2796 +5456,2024-01-19 17:05:00-07:00,28.6881 +5457,2024-01-19 17:10:00-07:00,28.3619 +5458,2024-01-19 17:15:00-07:00,28.0414 +5459,2024-01-19 17:20:00-07:00,27.822 +5460,2024-01-19 17:25:00-07:00,27.668 +5461,2024-01-19 17:30:00-07:00,27.7323 +5462,2024-01-19 17:35:00-07:00,27.6631 +5463,2024-01-19 17:40:00-07:00,27.153 +5464,2024-01-19 17:45:00-07:00,26.2894 +5465,2024-01-19 17:50:00-07:00,24.0768 +5466,2024-01-19 17:55:00-07:00,11.4415 +5467,2024-01-19 18:00:00-07:00,11.5812 +5468,2024-01-19 18:05:00-07:00,22.1491 +5469,2024-01-19 18:10:00-07:00,11.369 +5470,2024-01-19 18:15:00-07:00,19.1025 +5471,2024-01-19 18:20:00-07:00,20.3588 +5472,2024-01-19 18:25:00-07:00,19.3565 +5473,2024-01-19 18:30:00-07:00,19.482 +5474,2024-01-19 18:35:00-07:00,19.4817 +5475,2024-01-19 18:40:00-07:00,20.0504 +5476,2024-01-19 18:45:00-07:00,20.076 +5477,2024-01-19 18:50:00-07:00,20.9162 +5478,2024-01-19 18:55:00-07:00,22.3481 +5479,2024-01-19 19:00:00-07:00,24.5167 +5480,2024-01-19 19:05:00-07:00,23.5327 +5481,2024-01-19 19:10:00-07:00,23.343 +5482,2024-01-19 19:15:00-07:00,22.7898 +5483,2024-01-19 19:20:00-07:00,22.7581 +5484,2024-01-19 19:25:00-07:00,21.9244 +5485,2024-01-19 19:30:00-07:00,22.0625 +5486,2024-01-19 19:35:00-07:00,21.9872 +5487,2024-01-19 19:40:00-07:00,22.1577 +5488,2024-01-19 19:45:00-07:00,21.9072 +5489,2024-01-19 19:50:00-07:00,21.9365 +5490,2024-01-19 19:55:00-07:00,21.7376 +5491,2024-01-19 20:00:00-07:00,21.7073 +5492,2024-01-19 20:05:00-07:00,21.8726 +5493,2024-01-19 20:10:00-07:00,23.1365 +5494,2024-01-19 20:15:00-07:00,22.4959 +5495,2024-01-19 20:20:00-07:00,22.4751 +5496,2024-01-19 20:25:00-07:00,22.6167 +5497,2024-01-19 20:30:00-07:00,22.4385 +5498,2024-01-19 20:35:00-07:00,22.4999 +5499,2024-01-19 20:40:00-07:00,22.509 +5500,2024-01-19 20:45:00-07:00,22.2833 +5501,2024-01-19 20:50:00-07:00,21.9119 +5502,2024-01-19 20:55:00-07:00,21.952 +5503,2024-01-19 21:00:00-07:00,22.0943 +5504,2024-01-19 21:05:00-07:00,22.0541 +5505,2024-01-19 21:10:00-07:00,22.7013 +5506,2024-01-19 21:15:00-07:00,23.0981 +5507,2024-01-19 21:20:00-07:00,22.9872 +5508,2024-01-19 21:25:00-07:00,23.0371 +5509,2024-01-19 21:30:00-07:00,23.1105 +5510,2024-01-19 21:35:00-07:00,23.17 +5511,2024-01-19 21:40:00-07:00,23.7616 +5512,2024-01-19 21:45:00-07:00,23.3871 +5513,2024-01-19 21:50:00-07:00,23.3061 +5514,2024-01-19 21:55:00-07:00,22.8053 +5515,2024-01-19 22:00:00-07:00,22.3492 +5516,2024-01-19 22:05:00-07:00,22.7746 +5517,2024-01-19 22:10:00-07:00,26.226 +5518,2024-01-19 22:15:00-07:00,23.9743 +5519,2024-01-19 22:20:00-07:00,23.6427 +5520,2024-01-19 22:25:00-07:00,23.4865 +5521,2024-01-19 22:35:00-07:00,22.6495 +5522,2024-01-19 22:40:00-07:00,22.8144 +5523,2024-01-19 22:45:00-07:00,22.9802 +5524,2024-01-19 22:50:00-07:00,22.8287 +5525,2024-01-19 22:55:00-07:00,22.5391 +5526,2024-01-19 23:00:00-07:00,22.1089 +5527,2024-01-19 23:05:00-07:00,21.8411 +5528,2024-01-19 23:10:00-07:00,22.0727 +5529,2024-01-19 23:15:00-07:00,22.2309 +5530,2024-01-19 23:20:00-07:00,22.1878 +5531,2024-01-19 23:25:00-07:00,22.7573 +5532,2024-01-19 23:30:00-07:00,23.2134 +5533,2024-01-19 23:35:00-07:00,22.7427 +5534,2024-01-19 23:40:00-07:00,22.1834 +5535,2024-01-19 23:45:00-07:00,22.0334 +5536,2024-01-19 23:50:00-07:00,21.6328 +5537,2024-01-19 23:55:00-07:00,20.5665 +5538,2024-01-20 00:00:00-07:00,20.2724 +5539,2024-01-20 00:05:00-07:00,20.2798 +5540,2024-01-20 00:10:00-07:00,20.261 +5541,2024-01-20 00:15:00-07:00,20.3141 +5542,2024-01-20 00:20:00-07:00,20.3795 +5543,2024-01-20 00:25:00-07:00,20.3804 +5544,2024-01-20 00:30:00-07:00,20.2377 +5545,2024-01-20 00:35:00-07:00,20.2369 +5546,2024-01-20 00:40:00-07:00,20.2026 +5547,2024-01-20 00:45:00-07:00,20.108 +5548,2024-01-20 00:50:00-07:00,19.9581 +5549,2024-01-20 00:55:00-07:00,19.8041 +5550,2024-01-20 01:00:00-07:00,19.6999 +5551,2024-01-20 01:05:00-07:00,19.6602 +5552,2024-01-20 01:10:00-07:00,19.6238 +5553,2024-01-20 01:15:00-07:00,19.6018 +5554,2024-01-20 01:20:00-07:00,19.6461 +5555,2024-01-20 01:25:00-07:00,19.6825 +5556,2024-01-20 01:30:00-07:00,19.7438 +5557,2024-01-20 01:35:00-07:00,19.7236 +5558,2024-01-20 01:40:00-07:00,19.77 +5559,2024-01-20 01:45:00-07:00,19.7395 +5560,2024-01-20 01:50:00-07:00,19.7177 +5561,2024-01-20 01:55:00-07:00,19.7164 +5562,2024-01-20 02:00:00-07:00,19.7636 +5563,2024-01-20 02:05:00-07:00,19.7611 +5564,2024-01-20 02:10:00-07:00,19.8639 +5565,2024-01-20 02:15:00-07:00,19.8751 +5566,2024-01-20 02:20:00-07:00,19.8714 +5567,2024-01-20 02:25:00-07:00,19.853 +5568,2024-01-20 02:30:00-07:00,19.8057 +5569,2024-01-20 02:35:00-07:00,19.7349 +5570,2024-01-20 02:40:00-07:00,19.6591 +5571,2024-01-20 02:45:00-07:00,19.6399 +5572,2024-01-20 02:50:00-07:00,19.6329 +5573,2024-01-20 02:55:00-07:00,19.6362 +5574,2024-01-20 03:00:00-07:00,19.6837 +5575,2024-01-20 03:05:00-07:00,19.658 +5576,2024-01-20 03:10:00-07:00,19.6533 +5577,2024-01-20 03:15:00-07:00,19.6984 +5578,2024-01-20 03:20:00-07:00,19.6717 +5579,2024-01-20 03:25:00-07:00,19.5827 +5580,2024-01-20 03:30:00-07:00,19.532 +5581,2024-01-20 03:35:00-07:00,19.4787 +5582,2024-01-20 03:40:00-07:00,19.4368 +5583,2024-01-20 03:45:00-07:00,19.3822 +5584,2024-01-20 03:50:00-07:00,19.3636 +5585,2024-01-20 03:55:00-07:00,19.4095 +5586,2024-01-20 04:00:00-07:00,19.5104 +5587,2024-01-20 04:05:00-07:00,19.5849 +5588,2024-01-20 04:10:00-07:00,19.5279 +5589,2024-01-20 04:15:00-07:00,19.5553 +5590,2024-01-20 04:20:00-07:00,19.5634 +5591,2024-01-20 04:25:00-07:00,19.563 +5592,2024-01-20 04:30:00-07:00,19.6539 +5593,2024-01-20 04:35:00-07:00,19.6868 +5594,2024-01-20 04:40:00-07:00,19.753 +5595,2024-01-20 04:45:00-07:00,19.8539 +5596,2024-01-20 04:50:00-07:00,20.0927 +5597,2024-01-20 04:55:00-07:00,20.2473 +5598,2024-01-20 05:00:00-07:00,20.356 +5599,2024-01-20 05:05:00-07:00,20.3627 +5600,2024-01-20 05:10:00-07:00,20.3897 +5601,2024-01-20 05:15:00-07:00,20.2667 +5602,2024-01-20 05:20:00-07:00,20.2063 +5603,2024-01-20 05:25:00-07:00,20.174 +5604,2024-01-20 05:30:00-07:00,20.19 +5605,2024-01-20 05:35:00-07:00,20.229 +5606,2024-01-20 05:40:00-07:00,20.307 +5607,2024-01-20 05:45:00-07:00,20.2627 +5608,2024-01-20 05:50:00-07:00,20.381 +5609,2024-01-20 05:55:00-07:00,20.9967 +5610,2024-01-20 06:00:00-07:00,21.6323 +5611,2024-01-20 06:05:00-07:00,21.7376 +5612,2024-01-20 06:10:00-07:00,21.5743 +5613,2024-01-20 06:15:00-07:00,21.62 +5614,2024-01-20 06:20:00-07:00,21.7426 +5615,2024-01-20 06:25:00-07:00,22.1192 +5616,2024-01-20 06:30:00-07:00,21.9812 +5617,2024-01-20 06:35:00-07:00,22.1759 +5618,2024-01-20 06:40:00-07:00,22.2511 +5619,2024-01-20 06:45:00-07:00,22.455 +5620,2024-01-20 06:50:00-07:00,24.1277 +5621,2024-01-20 06:55:00-07:00,24.6713 +5622,2024-01-20 07:00:00-07:00,26.1806 +5623,2024-01-20 07:05:00-07:00,25.9767 +5624,2024-01-20 07:10:00-07:00,25.6093 +5625,2024-01-20 07:15:00-07:00,24.9114 +5626,2024-01-20 07:20:00-07:00,24.269 +5627,2024-01-20 07:25:00-07:00,24.0526 +5628,2024-01-20 07:30:00-07:00,23.9004 +5629,2024-01-20 07:35:00-07:00,23.8959 +5630,2024-01-20 07:40:00-07:00,23.7927 +5631,2024-01-20 07:45:00-07:00,23.4979 +5632,2024-01-20 07:50:00-07:00,23.3832 +5633,2024-01-20 07:55:00-07:00,23.0026 +5634,2024-01-20 08:00:00-07:00,21.5591 +5635,2024-01-20 08:05:00-07:00,22.1617 +5636,2024-01-20 08:10:00-07:00,22.7352 +5637,2024-01-20 08:15:00-07:00,22.8549 +5638,2024-01-20 08:20:00-07:00,22.8264 +5639,2024-01-20 08:25:00-07:00,22.8759 +5640,2024-01-20 08:30:00-07:00,23.1092 +5641,2024-01-20 08:35:00-07:00,23.074 +5642,2024-01-20 08:40:00-07:00,23.0216 +5643,2024-01-20 08:45:00-07:00,23.0325 +5644,2024-01-20 08:50:00-07:00,22.9039 +5645,2024-01-20 08:55:00-07:00,19.9699 +5646,2024-01-20 09:00:00-07:00,19.9855 +5647,2024-01-20 09:05:00-07:00,21.1154 +5648,2024-01-20 09:10:00-07:00,22.1165 +5649,2024-01-20 09:15:00-07:00,22.3633 +5650,2024-01-20 09:20:00-07:00,21.5276 +5651,2024-01-20 09:25:00-07:00,21.3505 +5652,2024-01-20 09:30:00-07:00,19.8938 +5653,2024-01-20 09:35:00-07:00,19.8159 +5654,2024-01-20 09:40:00-07:00,18.9985 +5655,2024-01-20 09:45:00-07:00,18.8296 +5656,2024-01-20 09:50:00-07:00,18.8549 +5657,2024-01-20 09:55:00-07:00,18.5678 +5658,2024-01-20 10:00:00-07:00,18.2944 +5659,2024-01-20 10:05:00-07:00,19.6571 +5660,2024-01-20 10:10:00-07:00,18.9209 +5661,2024-01-20 10:15:00-07:00,19.2347 +5662,2024-01-20 10:20:00-07:00,18.2899 +5663,2024-01-20 10:25:00-07:00,19.2576 +5664,2024-01-20 10:30:00-07:00,19.2849 +5665,2024-01-20 10:35:00-07:00,19.2791 +5666,2024-01-20 10:40:00-07:00,19.0578 +5667,2024-01-20 10:45:00-07:00,19.131 +5668,2024-01-20 10:50:00-07:00,18.9427 +5669,2024-01-20 10:55:00-07:00,18.8405 +5670,2024-01-20 11:00:00-07:00,15.9303 +5671,2024-01-20 11:05:00-07:00,18.079 +5672,2024-01-20 11:10:00-07:00,17.8611 +5673,2024-01-20 11:15:00-07:00,17.097 +5674,2024-01-20 11:20:00-07:00,18.2418 +5675,2024-01-20 11:25:00-07:00,18.251 +5676,2024-01-20 11:30:00-07:00,19.391 +5677,2024-01-20 11:35:00-07:00,19.1935 +5678,2024-01-20 11:40:00-07:00,17.2309 +5679,2024-01-20 11:45:00-07:00,17.1479 +5680,2024-01-20 11:50:00-07:00,16.5845 +5681,2024-01-20 11:55:00-07:00,16.8758 +5682,2024-01-20 12:00:00-07:00,16.848 +5683,2024-01-20 12:05:00-07:00,16.0775 +5684,2024-01-20 12:10:00-07:00,15.7782 +5685,2024-01-20 12:15:00-07:00,15.9679 +5686,2024-01-20 12:20:00-07:00,15.282 +5687,2024-01-20 12:25:00-07:00,15.7321 +5688,2024-01-20 12:30:00-07:00,15.557 +5689,2024-01-20 12:35:00-07:00,15.9027 +5690,2024-01-20 12:40:00-07:00,15.8626 +5691,2024-01-20 12:45:00-07:00,15.1562 +5692,2024-01-20 12:50:00-07:00,14.5875 +5693,2024-01-20 12:55:00-07:00,13.3802 +5694,2024-01-20 13:00:00-07:00,13.0813 +5695,2024-01-20 13:05:00-07:00,13.1538 +5696,2024-01-20 13:10:00-07:00,13.838 +5697,2024-01-20 13:15:00-07:00,13.1899 +5698,2024-01-20 13:20:00-07:00,13.4153 +5699,2024-01-20 13:25:00-07:00,13.7587 +5700,2024-01-20 13:30:00-07:00,14.1388 +5701,2024-01-20 13:35:00-07:00,13.794 +5702,2024-01-20 13:40:00-07:00,13.5612 +5703,2024-01-20 13:45:00-07:00,12.883 +5704,2024-01-20 13:50:00-07:00,12.6551 +5705,2024-01-20 13:55:00-07:00,12.4153 +5706,2024-01-20 14:00:00-07:00,12.14 +5707,2024-01-20 14:05:00-07:00,11.9119 +5708,2024-01-20 14:10:00-07:00,12.1006 +5709,2024-01-20 14:15:00-07:00,12.2209 +5710,2024-01-20 14:20:00-07:00,12.3511 +5711,2024-01-20 14:25:00-07:00,12.9372 +5712,2024-01-20 14:30:00-07:00,12.653 +5713,2024-01-20 14:35:00-07:00,12.4755 +5714,2024-01-20 14:40:00-07:00,12.673 +5715,2024-01-20 14:45:00-07:00,12.6369 +5716,2024-01-20 14:50:00-07:00,12.9303 +5717,2024-01-20 14:55:00-07:00,13.3658 +5718,2024-01-20 15:00:00-07:00,13.5653 +5719,2024-01-20 15:05:00-07:00,13.9005 +5720,2024-01-20 15:10:00-07:00,13.812 +5721,2024-01-20 15:15:00-07:00,13.9002 +5722,2024-01-20 15:20:00-07:00,13.3389 +5723,2024-01-20 15:25:00-07:00,13.8191 +5724,2024-01-20 15:30:00-07:00,15.7925 +5725,2024-01-20 15:35:00-07:00,16.3797 +5726,2024-01-20 15:40:00-07:00,18.7699 +5727,2024-01-20 15:45:00-07:00,19.092 +5728,2024-01-20 15:50:00-07:00,18.9918 +5729,2024-01-20 15:55:00-07:00,19.0133 +5730,2024-01-20 16:00:00-07:00,18.8521 +5731,2024-01-20 16:05:00-07:00,17.911 +5732,2024-01-20 16:10:00-07:00,17.8398 +5733,2024-01-20 16:15:00-07:00,17.6117 +5734,2024-01-20 16:20:00-07:00,17.8793 +5735,2024-01-20 16:25:00-07:00,16.7211 +5736,2024-01-20 16:30:00-07:00,16.9236 +5737,2024-01-20 16:35:00-07:00,17.1527 +5738,2024-01-20 16:40:00-07:00,17.4637 +5739,2024-01-20 16:45:00-07:00,17.5251 +5740,2024-01-20 16:50:00-07:00,17.6023 +5741,2024-01-20 16:55:00-07:00,16.9105 +5742,2024-01-20 17:00:00-07:00,16.2303 +5743,2024-01-20 17:05:00-07:00,16.4051 +5744,2024-01-20 17:10:00-07:00,16.4501 +5745,2024-01-20 17:15:00-07:00,16.323 +5746,2024-01-20 17:20:00-07:00,16.3267 +5747,2024-01-20 17:25:00-07:00,16.3021 +5748,2024-01-20 17:30:00-07:00,16.288 +5749,2024-01-20 17:35:00-07:00,16.3328 +5750,2024-01-20 17:40:00-07:00,16.2827 +5751,2024-01-20 17:45:00-07:00,16.2662 +5752,2024-01-20 17:50:00-07:00,16.2727 +5753,2024-01-20 17:55:00-07:00,16.1237 +5754,2024-01-20 18:00:00-07:00,15.9248 +5755,2024-01-20 18:05:00-07:00,15.9593 +5756,2024-01-20 18:10:00-07:00,16.0911 +5757,2024-01-20 18:15:00-07:00,16.0135 +5758,2024-01-20 18:20:00-07:00,15.9618 +5759,2024-01-20 18:25:00-07:00,15.8917 +5760,2024-01-20 18:30:00-07:00,15.8512 +5761,2024-01-20 18:35:00-07:00,15.8102 +5762,2024-01-20 18:40:00-07:00,15.827 +5763,2024-01-20 18:45:00-07:00,15.8116 +5764,2024-01-20 18:50:00-07:00,15.7624 +5765,2024-01-20 18:55:00-07:00,15.7432 +5766,2024-01-20 19:00:00-07:00,15.692 +5767,2024-01-20 19:05:00-07:00,15.7172 +5768,2024-01-20 19:10:00-07:00,15.8382 +5769,2024-01-20 19:15:00-07:00,16.0082 +5770,2024-01-20 19:20:00-07:00,15.9828 +5771,2024-01-20 19:25:00-07:00,15.9965 +5772,2024-01-20 19:30:00-07:00,15.9162 +5773,2024-01-20 19:35:00-07:00,15.8869 +5774,2024-01-20 19:40:00-07:00,15.9005 +5775,2024-01-20 19:45:00-07:00,15.8801 +5776,2024-01-20 19:50:00-07:00,15.7488 +5777,2024-01-20 19:55:00-07:00,15.5001 +5778,2024-01-20 20:00:00-07:00,15.3855 +5779,2024-01-20 20:05:00-07:00,15.3069 +5780,2024-01-20 20:10:00-07:00,19.7512 +5781,2024-01-20 20:15:00-07:00,19.2833 +5782,2024-01-20 20:20:00-07:00,16.5073 +5783,2024-01-20 20:25:00-07:00,15.7478 +5784,2024-01-20 20:30:00-07:00,15.755 +5785,2024-01-20 20:35:00-07:00,15.7067 +5786,2024-01-20 20:40:00-07:00,15.6404 +5787,2024-01-20 20:45:00-07:00,15.6228 +5788,2024-01-20 20:50:00-07:00,15.1694 +5789,2024-01-20 20:55:00-07:00,14.7099 +5790,2024-01-20 21:00:00-07:00,14.8083 +5791,2024-01-20 21:05:00-07:00,14.8178 +5792,2024-01-20 21:10:00-07:00,15.0298 +5793,2024-01-20 21:15:00-07:00,15.3429 +5794,2024-01-20 21:20:00-07:00,15.3496 +5795,2024-01-20 21:25:00-07:00,15.3043 +5796,2024-01-20 21:30:00-07:00,15.207 +5797,2024-01-20 21:35:00-07:00,15.2283 +5798,2024-01-20 21:40:00-07:00,15.2249 +5799,2024-01-20 21:45:00-07:00,15.2837 +5800,2024-01-20 21:50:00-07:00,15.2869 +5801,2024-01-20 21:55:00-07:00,15.1178 +5802,2024-01-20 22:00:00-07:00,15.0887 +5803,2024-01-20 22:05:00-07:00,15.1463 +5804,2024-01-20 22:10:00-07:00,19.8411 +5805,2024-01-20 22:15:00-07:00,22.4622 +5806,2024-01-20 22:20:00-07:00,17.0586 +5807,2024-01-20 22:25:00-07:00,19.038 +5808,2024-01-20 22:30:00-07:00,15.9595 +5809,2024-01-20 22:35:00-07:00,16.1465 +5810,2024-01-20 22:40:00-07:00,16.2029 +5811,2024-01-20 22:45:00-07:00,16.2868 +5812,2024-01-20 22:50:00-07:00,16.2776 +5813,2024-01-20 22:55:00-07:00,16.044 +5814,2024-01-20 23:00:00-07:00,15.9336 +5815,2024-01-20 23:05:00-07:00,15.9663 +5816,2024-01-20 23:10:00-07:00,15.9937 +5817,2024-01-20 23:15:00-07:00,16.0535 +5818,2024-01-20 23:20:00-07:00,15.9046 +5819,2024-01-20 23:25:00-07:00,15.9333 +5820,2024-01-20 23:30:00-07:00,15.8848 +5821,2024-01-20 23:35:00-07:00,15.825 +5822,2024-01-20 23:40:00-07:00,15.8875 +5823,2024-01-20 23:45:00-07:00,16.3808 +5824,2024-01-20 23:50:00-07:00,16.4879 +5825,2024-01-20 23:55:00-07:00,16.4799 +5826,2024-01-21 00:00:00-07:00,16.8712 +5827,2024-01-21 00:05:00-07:00,18.0161 +5828,2024-01-21 00:10:00-07:00,17.7586 +5829,2024-01-21 00:15:00-07:00,18.1248 +5830,2024-01-21 00:20:00-07:00,18.1053 +5831,2024-01-21 00:25:00-07:00,17.8968 +5832,2024-01-21 00:30:00-07:00,17.6747 +5833,2024-01-21 00:35:00-07:00,17.6244 +5834,2024-01-21 00:40:00-07:00,17.5924 +5835,2024-01-21 00:45:00-07:00,17.41 +5836,2024-01-21 00:50:00-07:00,17.571 +5837,2024-01-21 00:55:00-07:00,17.5331 +5838,2024-01-21 01:00:00-07:00,17.3179 +5839,2024-01-21 01:05:00-07:00,17.3295 +5840,2024-01-21 01:10:00-07:00,17.1051 +5841,2024-01-21 01:15:00-07:00,17.2178 +5842,2024-01-21 01:20:00-07:00,17.351 +5843,2024-01-21 01:25:00-07:00,17.1441 +5844,2024-01-21 01:30:00-07:00,17.0655 +5845,2024-01-21 01:35:00-07:00,17.0677 +5846,2024-01-21 01:40:00-07:00,17.1113 +5847,2024-01-21 01:45:00-07:00,17.1188 +5848,2024-01-21 01:50:00-07:00,17.1289 +5849,2024-01-21 01:55:00-07:00,17.1157 +5850,2024-01-21 02:00:00-07:00,17.4747 +5851,2024-01-21 02:05:00-07:00,17.8005 +5852,2024-01-21 02:10:00-07:00,17.9365 +5853,2024-01-21 02:15:00-07:00,18.2117 +5854,2024-01-21 02:20:00-07:00,18.2479 +5855,2024-01-21 02:25:00-07:00,18.4574 +5856,2024-01-21 02:30:00-07:00,18.7551 +5857,2024-01-21 02:35:00-07:00,18.6636 +5858,2024-01-21 02:40:00-07:00,18.3985 +5859,2024-01-21 02:45:00-07:00,18.2612 +5860,2024-01-21 02:50:00-07:00,18.1265 +5861,2024-01-21 02:55:00-07:00,18.4043 +5862,2024-01-21 03:00:00-07:00,18.4562 +5863,2024-01-21 03:05:00-07:00,19.0761 +5864,2024-01-21 03:10:00-07:00,19.156 +5865,2024-01-21 03:15:00-07:00,18.951 +5866,2024-01-21 03:20:00-07:00,18.8475 +5867,2024-01-21 03:25:00-07:00,19.2784 +5868,2024-01-21 03:30:00-07:00,19.191 +5869,2024-01-21 03:35:00-07:00,18.6429 +5870,2024-01-21 03:40:00-07:00,18.4836 +5871,2024-01-21 03:45:00-07:00,18.1562 +5872,2024-01-21 03:50:00-07:00,18.014 +5873,2024-01-21 03:55:00-07:00,18.2645 +5874,2024-01-21 04:00:00-07:00,17.9981 +5875,2024-01-21 04:05:00-07:00,17.7711 +5876,2024-01-21 04:10:00-07:00,17.8478 +5877,2024-01-21 04:15:00-07:00,17.9255 +5878,2024-01-21 04:20:00-07:00,18.266 +5879,2024-01-21 04:25:00-07:00,19.0998 +5880,2024-01-21 04:30:00-07:00,20.0724 +5881,2024-01-21 04:35:00-07:00,20.0997 +5882,2024-01-21 04:40:00-07:00,19.7947 +5883,2024-01-21 04:45:00-07:00,19.7238 +5884,2024-01-21 04:50:00-07:00,22.0463 +5885,2024-01-21 04:55:00-07:00,22.8195 +5886,2024-01-21 05:00:00-07:00,21.6315 +5887,2024-01-21 05:05:00-07:00,21.034 +5888,2024-01-21 05:10:00-07:00,20.8643 +5889,2024-01-21 05:15:00-07:00,20.6592 +5890,2024-01-21 05:20:00-07:00,20.7627 +5891,2024-01-21 05:25:00-07:00,21.2739 +5892,2024-01-21 05:30:00-07:00,21.312 +5893,2024-01-21 05:35:00-07:00,21.49 +5894,2024-01-21 05:40:00-07:00,22.7271 +5895,2024-01-21 05:45:00-07:00,22.9885 +5896,2024-01-21 05:50:00-07:00,23.4141 +5897,2024-01-21 05:55:00-07:00,23.1191 +5898,2024-01-21 06:00:00-07:00,23.0683 +5899,2024-01-21 06:05:00-07:00,22.9459 +5900,2024-01-21 06:10:00-07:00,21.9999 +5901,2024-01-21 06:15:00-07:00,20.3464 +5902,2024-01-21 06:20:00-07:00,19.9784 +5903,2024-01-21 06:25:00-07:00,20.056 +5904,2024-01-21 06:30:00-07:00,20.9781 +5905,2024-01-21 06:35:00-07:00,20.7679 +5906,2024-01-21 06:40:00-07:00,20.7712 +5907,2024-01-21 06:45:00-07:00,20.8381 +5908,2024-01-21 06:50:00-07:00,21.4576 +5909,2024-01-21 06:55:00-07:00,20.5599 +5910,2024-01-21 07:00:00-07:00,19.7269 +5911,2024-01-21 07:05:00-07:00,19.5824 +5912,2024-01-21 07:10:00-07:00,20.117 +5913,2024-01-21 07:15:00-07:00,20.0071 +5914,2024-01-21 07:20:00-07:00,20.1388 +5915,2024-01-21 07:25:00-07:00,20.3618 +5916,2024-01-21 07:30:00-07:00,20.4251 +5917,2024-01-21 07:35:00-07:00,20.4849 +5918,2024-01-21 07:40:00-07:00,20.4906 +5919,2024-01-21 07:45:00-07:00,20.6941 +5920,2024-01-21 07:50:00-07:00,20.2936 +5921,2024-01-21 07:55:00-07:00,20.1277 +5922,2024-01-21 08:00:00-07:00,19.9628 +5923,2024-01-21 08:05:00-07:00,20.226 +5924,2024-01-21 08:10:00-07:00,20.4522 +5925,2024-01-21 08:15:00-07:00,20.5771 +5926,2024-01-21 08:20:00-07:00,20.6101 +5927,2024-01-21 08:25:00-07:00,20.555 +5928,2024-01-21 08:30:00-07:00,20.7382 +5929,2024-01-21 08:35:00-07:00,20.7901 +5930,2024-01-21 08:40:00-07:00,20.6935 +5931,2024-01-21 08:45:00-07:00,20.6476 +5932,2024-01-21 08:50:00-07:00,20.4961 +5933,2024-01-21 08:55:00-07:00,20.575 +5934,2024-01-21 09:00:00-07:00,20.7963 +5935,2024-01-21 09:05:00-07:00,21.1847 +5936,2024-01-21 09:10:00-07:00,21.6594 +5937,2024-01-21 09:15:00-07:00,23.2375 +5938,2024-01-21 09:20:00-07:00,22.2795 +5939,2024-01-21 09:25:00-07:00,21.2999 +5940,2024-01-21 09:30:00-07:00,20.9556 +5941,2024-01-21 09:35:00-07:00,20.8914 +5942,2024-01-21 09:40:00-07:00,21.0066 +5943,2024-01-21 09:45:00-07:00,21.6606 +5944,2024-01-21 09:50:00-07:00,20.9726 +5945,2024-01-21 09:55:00-07:00,20.9235 +5946,2024-01-21 10:00:00-07:00,21.9448 +5947,2024-01-21 10:05:00-07:00,22.5573 +5948,2024-01-21 10:10:00-07:00,23.4771 +5949,2024-01-21 10:15:00-07:00,24.4242 +5950,2024-01-21 10:20:00-07:00,24.069 +5951,2024-01-21 10:25:00-07:00,23.5359 +5952,2024-01-21 10:30:00-07:00,23.4247 +5953,2024-01-21 10:35:00-07:00,23.3566 +5954,2024-01-21 10:40:00-07:00,22.5126 +5955,2024-01-21 10:45:00-07:00,22.9558 +5956,2024-01-21 10:50:00-07:00,21.9539 +5957,2024-01-21 10:55:00-07:00,20.9434 +5958,2024-01-21 11:00:00-07:00,20.5517 +5959,2024-01-21 11:05:00-07:00,20.4328 +5960,2024-01-21 11:10:00-07:00,20.3889 +5961,2024-01-21 11:15:00-07:00,20.6033 +5962,2024-01-21 11:20:00-07:00,20.3221 +5963,2024-01-21 11:25:00-07:00,20.1856 +5964,2024-01-21 11:30:00-07:00,20.0573 +5965,2024-01-21 11:35:00-07:00,19.7862 +5966,2024-01-21 11:40:00-07:00,19.6755 +5967,2024-01-21 11:45:00-07:00,19.6762 +5968,2024-01-21 11:50:00-07:00,19.5481 +5969,2024-01-21 11:55:00-07:00,19.8689 +5970,2024-01-21 12:00:00-07:00,19.6806 +5971,2024-01-21 12:05:00-07:00,19.6448 +5972,2024-01-21 12:10:00-07:00,19.5427 +5973,2024-01-21 12:15:00-07:00,23.6192 +5974,2024-01-21 12:20:00-07:00,19.8001 +5975,2024-01-21 12:25:00-07:00,18.5037 +5976,2024-01-21 12:30:00-07:00,19.5116 +5977,2024-01-21 12:35:00-07:00,24.0189 +5978,2024-01-21 12:40:00-07:00,23.297 +5979,2024-01-21 12:45:00-07:00,22.4499 +5980,2024-01-21 12:50:00-07:00,19.8669 +5981,2024-01-21 12:55:00-07:00,23.7565 +5982,2024-01-21 13:00:00-07:00,22.9591 +5983,2024-01-21 13:05:00-07:00,22.3217 +5984,2024-01-21 13:10:00-07:00,22.4191 +5985,2024-01-21 13:15:00-07:00,25.3189 +5986,2024-01-21 13:20:00-07:00,25.0609 +5987,2024-01-21 13:25:00-07:00,23.9697 +5988,2024-01-21 13:30:00-07:00,23.8918 +5989,2024-01-21 13:35:00-07:00,23.8968 +5990,2024-01-21 13:40:00-07:00,23.5341 +5991,2024-01-21 13:45:00-07:00,23.5358 +5992,2024-01-21 13:50:00-07:00,23.8332 +5993,2024-01-21 13:55:00-07:00,23.8909 +5994,2024-01-21 14:00:00-07:00,23.7945 +5995,2024-01-21 14:05:00-07:00,23.8165 +5996,2024-01-21 14:10:00-07:00,23.7514 +5997,2024-01-21 14:15:00-07:00,23.72 +5998,2024-01-21 14:20:00-07:00,23.9631 +5999,2024-01-21 14:25:00-07:00,23.9634 +6000,2024-01-21 14:30:00-07:00,24.1283 +6001,2024-01-21 14:35:00-07:00,24.1233 +6002,2024-01-21 14:40:00-07:00,24.0401 +6003,2024-01-21 14:45:00-07:00,23.229 +6004,2024-01-21 14:50:00-07:00,24.4032 +6005,2024-01-21 14:55:00-07:00,24.2688 +6006,2024-01-21 15:00:00-07:00,24.5073 +6007,2024-01-21 15:05:00-07:00,24.2667 +6008,2024-01-21 15:10:00-07:00,24.3388 +6009,2024-01-21 15:15:00-07:00,24.8963 +6010,2024-01-21 15:20:00-07:00,24.8916 +6011,2024-01-21 15:25:00-07:00,25.4038 +6012,2024-01-21 15:30:00-07:00,24.9434 +6013,2024-01-21 15:35:00-07:00,24.6598 +6014,2024-01-21 15:40:00-07:00,24.581 +6015,2024-01-21 15:45:00-07:00,24.1657 +6016,2024-01-21 15:50:00-07:00,399.624 +6017,2024-01-21 15:55:00-07:00,571.4529 +6018,2024-01-21 16:00:00-07:00,27.8301 +6019,2024-01-21 16:05:00-07:00,28.0843 +6020,2024-01-21 16:10:00-07:00,27.97 +6021,2024-01-21 16:15:00-07:00,28.2917 +6022,2024-01-21 16:20:00-07:00,28.8669 +6023,2024-01-21 16:25:00-07:00,28.2442 +6024,2024-01-21 16:30:00-07:00,29.4675 +6025,2024-01-21 16:35:00-07:00,30.2721 +6026,2024-01-21 16:40:00-07:00,31.0069 +6027,2024-01-21 16:45:00-07:00,31.8422 +6028,2024-01-21 16:50:00-07:00,655.7059 +6029,2024-01-21 16:55:00-07:00,29.1469 +6030,2024-01-21 17:00:00-07:00,29.3337 +6031,2024-01-21 17:05:00-07:00,28.4299 +6032,2024-01-21 17:10:00-07:00,28.4571 +6033,2024-01-21 17:15:00-07:00,27.0315 +6034,2024-01-21 17:20:00-07:00,27.5876 +6035,2024-01-21 17:25:00-07:00,28.097 +6036,2024-01-21 17:30:00-07:00,28.5342 +6037,2024-01-21 17:35:00-07:00,28.6726 +6038,2024-01-21 17:40:00-07:00,28.5336 +6039,2024-01-21 17:45:00-07:00,28.6799 +6040,2024-01-21 17:50:00-07:00,28.8899 +6041,2024-01-21 17:55:00-07:00,29.5331 +6042,2024-01-21 18:00:00-07:00,27.0662 +6043,2024-01-21 18:05:00-07:00,28.0712 +6044,2024-01-21 18:10:00-07:00,27.8294 +6045,2024-01-21 18:15:00-07:00,27.8178 +6046,2024-01-21 18:20:00-07:00,27.7777 +6047,2024-01-21 18:25:00-07:00,27.2337 +6048,2024-01-21 18:30:00-07:00,26.8228 +6049,2024-01-21 18:35:00-07:00,26.2572 +6050,2024-01-21 18:40:00-07:00,25.853 +6051,2024-01-21 18:45:00-07:00,25.3628 +6052,2024-01-21 18:50:00-07:00,25.0464 +6053,2024-01-21 18:55:00-07:00,25.3297 +6054,2024-01-21 19:00:00-07:00,655.4881 +6055,2024-01-21 19:05:00-07:00,29.0807 +6056,2024-01-21 19:10:00-07:00,26.9142 +6057,2024-01-21 19:15:00-07:00,26.3918 +6058,2024-01-21 19:20:00-07:00,26.088 +6059,2024-01-21 19:25:00-07:00,25.5877 +6060,2024-01-21 19:30:00-07:00,24.887 +6061,2024-01-21 19:35:00-07:00,24.8477 +6062,2024-01-21 19:40:00-07:00,24.7444 +6063,2024-01-21 19:45:00-07:00,26.0697 +6064,2024-01-21 19:50:00-07:00,24.7263 +6065,2024-01-21 19:55:00-07:00,25.0488 +6066,2024-01-21 20:00:00-07:00,25.022 +6067,2024-01-21 20:05:00-07:00,24.9097 +6068,2024-01-21 20:10:00-07:00,25.272 +6069,2024-01-21 20:15:00-07:00,25.4318 +6070,2024-01-21 20:20:00-07:00,25.1321 +6071,2024-01-21 20:25:00-07:00,25.1631 +6072,2024-01-21 20:30:00-07:00,25.1662 +6073,2024-01-21 20:35:00-07:00,25.0356 +6074,2024-01-21 20:40:00-07:00,24.8035 +6075,2024-01-21 20:45:00-07:00,24.6431 +6076,2024-01-21 20:50:00-07:00,24.225 +6077,2024-01-21 20:55:00-07:00,24.361 +6078,2024-01-21 21:00:00-07:00,24.5028 +6079,2024-01-21 21:05:00-07:00,24.5048 +6080,2024-01-21 21:10:00-07:00,24.6103 +6081,2024-01-21 21:15:00-07:00,24.7345 +6082,2024-01-21 21:20:00-07:00,24.5384 +6083,2024-01-21 21:25:00-07:00,24.3756 +6084,2024-01-21 21:30:00-07:00,24.4562 +6085,2024-01-21 21:35:00-07:00,24.4439 +6086,2024-01-21 21:40:00-07:00,24.4546 +6087,2024-01-21 21:45:00-07:00,24.364 +6088,2024-01-21 21:50:00-07:00,24.3634 +6089,2024-01-21 21:55:00-07:00,24.3628 +6090,2024-01-21 22:00:00-07:00,24.3692 +6091,2024-01-21 22:05:00-07:00,24.4825 +6092,2024-01-21 22:10:00-07:00,24.8453 +6093,2024-01-21 22:15:00-07:00,24.6878 +6094,2024-01-21 22:20:00-07:00,24.8215 +6095,2024-01-21 22:25:00-07:00,24.9599 +6096,2024-01-21 22:30:00-07:00,25.1726 +6097,2024-01-21 22:35:00-07:00,25.1559 +6098,2024-01-21 22:40:00-07:00,24.935 +6099,2024-01-21 22:45:00-07:00,24.9818 +6100,2024-01-21 23:00:00-07:00,24.5865 +6101,2024-01-21 23:05:00-07:00,25.1464 +6102,2024-01-21 23:15:00-07:00,24.8946 +6103,2024-01-21 23:20:00-07:00,24.5329 +6104,2024-01-21 23:25:00-07:00,24.189 +6105,2024-01-21 23:30:00-07:00,25.4148 +6106,2024-01-21 23:35:00-07:00,24.4556 +6107,2024-01-21 23:40:00-07:00,24.2112 +6108,2024-01-21 23:45:00-07:00,24.2507 +6109,2024-01-21 23:50:00-07:00,24.088 +6110,2024-01-21 23:55:00-07:00,24.1345 +6111,2024-01-22 00:00:00-07:00,25.2367 +6112,2024-01-22 00:05:00-07:00,24.4283 +6113,2024-01-22 00:10:00-07:00,24.4217 +6114,2024-01-22 00:15:00-07:00,24.7446 +6115,2024-01-22 00:20:00-07:00,24.7727 +6116,2024-01-22 00:25:00-07:00,24.8758 +6117,2024-01-22 00:30:00-07:00,25.3254 +6118,2024-01-22 00:35:00-07:00,25.5936 +6119,2024-01-22 00:40:00-07:00,25.9178 +6120,2024-01-22 00:45:00-07:00,25.9678 +6121,2024-01-22 00:50:00-07:00,25.9531 +6122,2024-01-22 00:55:00-07:00,25.9939 +6123,2024-01-22 01:00:00-07:00,25.9738 +6124,2024-01-22 01:05:00-07:00,26.1969 +6125,2024-01-22 01:10:00-07:00,26.1498 +6126,2024-01-22 01:15:00-07:00,26.0122 +6127,2024-01-22 01:20:00-07:00,25.7758 +6128,2024-01-22 01:25:00-07:00,25.7323 +6129,2024-01-22 01:30:00-07:00,25.5537 +6130,2024-01-22 01:35:00-07:00,25.1776 +6131,2024-01-22 01:40:00-07:00,25.4577 +6132,2024-01-22 01:45:00-07:00,25.4113 +6133,2024-01-22 01:50:00-07:00,25.4379 +6134,2024-01-22 01:55:00-07:00,25.4721 +6135,2024-01-22 02:00:00-07:00,25.4386 +6136,2024-01-22 02:05:00-07:00,25.4292 +6137,2024-01-22 02:10:00-07:00,25.4303 +6138,2024-01-22 02:15:00-07:00,25.4109 +6139,2024-01-22 02:20:00-07:00,25.4048 +6140,2024-01-22 02:25:00-07:00,25.3994 +6141,2024-01-22 02:30:00-07:00,25.4253 +6142,2024-01-22 02:35:00-07:00,25.4045 +6143,2024-01-22 02:40:00-07:00,25.399 +6144,2024-01-22 02:45:00-07:00,25.3789 +6145,2024-01-22 02:50:00-07:00,25.3598 +6146,2024-01-22 02:55:00-07:00,25.3469 +6147,2024-01-22 03:00:00-07:00,25.3519 +6148,2024-01-22 03:05:00-07:00,25.3437 +6149,2024-01-22 03:10:00-07:00,25.3295 +6150,2024-01-22 03:15:00-07:00,25.1778 +6151,2024-01-22 03:20:00-07:00,25.037 +6152,2024-01-22 03:25:00-07:00,24.9342 +6153,2024-01-22 03:30:00-07:00,25.1056 +6154,2024-01-22 03:35:00-07:00,25.1625 +6155,2024-01-22 03:40:00-07:00,25.1911 +6156,2024-01-22 03:45:00-07:00,25.2285 +6157,2024-01-22 03:50:00-07:00,25.3551 +6158,2024-01-22 03:55:00-07:00,25.4892 +6159,2024-01-22 04:00:00-07:00,25.7468 +6160,2024-01-22 04:05:00-07:00,25.7396 +6161,2024-01-22 04:10:00-07:00,26.6691 +6162,2024-01-22 04:15:00-07:00,27.1765 +6163,2024-01-22 04:20:00-07:00,26.8976 +6164,2024-01-22 04:25:00-07:00,26.4955 +6165,2024-01-22 04:30:00-07:00,26.5452 +6166,2024-01-22 04:35:00-07:00,26.845 +6167,2024-01-22 04:40:00-07:00,26.9881 +6168,2024-01-22 04:45:00-07:00,27.905 +6169,2024-01-22 04:50:00-07:00,31.7281 +6170,2024-01-22 04:55:00-07:00,37.4776 +6171,2024-01-22 05:00:00-07:00,39.0488 +6172,2024-01-22 05:05:00-07:00,39.0749 +6173,2024-01-22 05:10:00-07:00,39.0593 +6174,2024-01-22 05:15:00-07:00,39.0519 +6175,2024-01-22 05:20:00-07:00,39.0293 +6176,2024-01-22 05:25:00-07:00,32.5552 +6177,2024-01-22 05:30:00-07:00,31.6951 +6178,2024-01-22 05:35:00-07:00,27.1546 +6179,2024-01-22 05:40:00-07:00,25.7488 +6180,2024-01-22 05:45:00-07:00,26.2771 +6181,2024-01-22 05:50:00-07:00,27.517 +6182,2024-01-22 05:55:00-07:00,26.9878 +6183,2024-01-22 06:00:00-07:00,24.2861 +6184,2024-01-22 06:05:00-07:00,24.69 +6185,2024-01-22 06:10:00-07:00,24.7203 +6186,2024-01-22 06:15:00-07:00,24.7999 +6187,2024-01-22 06:20:00-07:00,25.3856 +6188,2024-01-22 06:25:00-07:00,25.5995 +6189,2024-01-22 06:30:00-07:00,25.4181 +6190,2024-01-22 06:35:00-07:00,27.6763 +6191,2024-01-22 06:40:00-07:00,31.2272 +6192,2024-01-22 06:45:00-07:00,29.4948 +6193,2024-01-22 06:50:00-07:00,29.6551 +6194,2024-01-22 06:55:00-07:00,29.2798 +6195,2024-01-22 07:00:00-07:00,26.572 +6196,2024-01-22 07:05:00-07:00,27.8631 +6197,2024-01-22 07:10:00-07:00,26.8594 +6198,2024-01-22 07:15:00-07:00,26.6167 +6199,2024-01-22 07:20:00-07:00,26.1135 +6200,2024-01-22 07:25:00-07:00,25.58 +6201,2024-01-22 07:30:00-07:00,24.6539 +6202,2024-01-22 07:35:00-07:00,24.3561 +6203,2024-01-22 07:40:00-07:00,24.0006 +6204,2024-01-22 07:45:00-07:00,23.9 +6205,2024-01-22 07:50:00-07:00,23.6828 +6206,2024-01-22 07:55:00-07:00,23.8321 +6207,2024-01-22 08:00:00-07:00,23.8294 +6208,2024-01-22 08:05:00-07:00,23.7021 +6209,2024-01-22 08:10:00-07:00,23.6404 +6210,2024-01-22 08:15:00-07:00,23.4264 +6211,2024-01-22 08:20:00-07:00,23.4041 +6212,2024-01-22 08:25:00-07:00,17.8051 +6213,2024-01-22 08:30:00-07:00,16.5993 +6214,2024-01-22 08:35:00-07:00,16.572 +6215,2024-01-22 08:40:00-07:00,16.4849 +6216,2024-01-22 08:45:00-07:00,18.1009 +6217,2024-01-22 08:50:00-07:00,17.9631 +6218,2024-01-22 08:55:00-07:00,18.212 +6219,2024-01-22 09:00:00-07:00,26.2957 +6220,2024-01-22 09:05:00-07:00,26.1368 +6221,2024-01-22 09:10:00-07:00,26.2214 +6222,2024-01-22 09:15:00-07:00,45.5377 +6223,2024-01-22 09:20:00-07:00,43.4893 +6224,2024-01-22 09:25:00-07:00,43.5234 +6225,2024-01-22 09:30:00-07:00,42.7964 +6226,2024-01-22 09:35:00-07:00,33.4593 +6227,2024-01-22 09:40:00-07:00,25.4033 +6228,2024-01-22 09:45:00-07:00,26.8063 +6229,2024-01-22 09:50:00-07:00,27.5366 +6230,2024-01-22 09:55:00-07:00,28.9547 +6231,2024-01-22 10:00:00-07:00,37.9762 +6232,2024-01-22 10:05:00-07:00,38.5949 +6233,2024-01-22 10:10:00-07:00,41.3544 +6234,2024-01-22 10:15:00-07:00,46.1944 +6235,2024-01-22 10:20:00-07:00,43.5089 +6236,2024-01-22 10:25:00-07:00,43.8611 +6237,2024-01-22 10:30:00-07:00,36.6519 +6238,2024-01-22 10:35:00-07:00,34.8238 +6239,2024-01-22 10:40:00-07:00,34.7947 +6240,2024-01-22 10:45:00-07:00,32.7858 +6241,2024-01-22 10:50:00-07:00,28.6387 +6242,2024-01-22 10:55:00-07:00,25.3489 +6243,2024-01-22 11:00:00-07:00,22.1145 +6244,2024-01-22 11:05:00-07:00,29.7738 +6245,2024-01-22 11:10:00-07:00,30.8123 +6246,2024-01-22 11:15:00-07:00,39.5718 +6247,2024-01-22 11:20:00-07:00,38.9424 +6248,2024-01-22 11:25:00-07:00,34.447 +6249,2024-01-22 11:30:00-07:00,34.7176 +6250,2024-01-22 11:35:00-07:00,38.5911 +6251,2024-01-22 11:40:00-07:00,36.4417 +6252,2024-01-22 11:45:00-07:00,33.6156 +6253,2024-01-22 11:50:00-07:00,26.6226 +6254,2024-01-22 11:55:00-07:00,32.8774 +6255,2024-01-22 12:00:00-07:00,31.69 +6256,2024-01-22 12:05:00-07:00,32.8076 +6257,2024-01-22 12:10:00-07:00,33.4675 +6258,2024-01-22 12:15:00-07:00,33.2753 +6259,2024-01-22 12:20:00-07:00,33.1835 +6260,2024-01-22 12:25:00-07:00,33.2427 +6261,2024-01-22 12:30:00-07:00,33.2672 +6262,2024-01-22 12:35:00-07:00,33.2151 +6263,2024-01-22 12:40:00-07:00,27.5636 +6264,2024-01-22 12:45:00-07:00,26.4206 +6265,2024-01-22 12:50:00-07:00,25.0391 +6266,2024-01-22 12:55:00-07:00,24.1925 +6267,2024-01-22 13:00:00-07:00,33.4668 +6268,2024-01-22 13:05:00-07:00,28.2194 +6269,2024-01-22 13:10:00-07:00,34.7755 +6270,2024-01-22 13:15:00-07:00,34.9487 +6271,2024-01-22 13:20:00-07:00,33.3341 +6272,2024-01-22 13:25:00-07:00,28.3811 +6273,2024-01-22 13:30:00-07:00,27.6403 +6274,2024-01-22 13:35:00-07:00,26.5156 +6275,2024-01-22 13:40:00-07:00,27.5617 +6276,2024-01-22 13:45:00-07:00,27.5538 +6277,2024-01-22 13:50:00-07:00,27.5402 +6278,2024-01-22 13:55:00-07:00,27.3292 +6279,2024-01-22 14:00:00-07:00,27.4953 +6280,2024-01-22 14:05:00-07:00,27.6558 +6281,2024-01-22 14:10:00-07:00,27.1731 +6282,2024-01-22 14:15:00-07:00,27.9905 +6283,2024-01-22 14:20:00-07:00,32.8981 +6284,2024-01-22 14:25:00-07:00,32.348 +6285,2024-01-22 14:30:00-07:00,39.4263 +6286,2024-01-22 14:35:00-07:00,34.5118 +6287,2024-01-22 14:40:00-07:00,33.354 +6288,2024-01-22 14:45:00-07:00,33.6105 +6289,2024-01-22 14:50:00-07:00,36.1021 +6290,2024-01-22 14:55:00-07:00,39.851 +6291,2024-01-22 15:00:00-07:00,43.7333 +6292,2024-01-22 15:05:00-07:00,44.6138 +6293,2024-01-22 15:10:00-07:00,47.9423 +6294,2024-01-22 15:15:00-07:00,42.4686 +6295,2024-01-22 15:20:00-07:00,38.2202 +6296,2024-01-22 15:25:00-07:00,136.6435 +6297,2024-01-22 15:30:00-07:00,40.406 +6298,2024-01-22 15:35:00-07:00,40.8666 +6299,2024-01-22 15:40:00-07:00,40.4025 +6300,2024-01-22 15:45:00-07:00,39.7975 +6301,2024-01-22 15:50:00-07:00,41.5137 +6302,2024-01-22 15:55:00-07:00,209.239 +6303,2024-01-22 16:00:00-07:00,44.3504 +6304,2024-01-22 16:05:00-07:00,36.3724 +6305,2024-01-22 16:10:00-07:00,52.3801 +6306,2024-01-22 16:15:00-07:00,48.2647 +6307,2024-01-22 16:20:00-07:00,43.1749 +6308,2024-01-22 16:25:00-07:00,44.4649 +6309,2024-01-22 16:30:00-07:00,47.7919 +6310,2024-01-22 16:35:00-07:00,57.048 +6311,2024-01-22 16:40:00-07:00,56.5785 +6312,2024-01-22 16:45:00-07:00,53.1441 +6313,2024-01-22 16:50:00-07:00,65.6726 +6314,2024-01-22 16:55:00-07:00,145.7489 +6315,2024-01-22 17:00:00-07:00,132.0288 +6316,2024-01-22 17:05:00-07:00,42.5283 +6317,2024-01-22 17:10:00-07:00,41.2739 +6318,2024-01-22 17:15:00-07:00,31.7549 +6319,2024-01-22 17:20:00-07:00,34.7359 +6320,2024-01-22 17:25:00-07:00,35.7373 +6321,2024-01-22 17:30:00-07:00,35.1023 +6322,2024-01-22 17:35:00-07:00,35.5762 +6323,2024-01-22 17:40:00-07:00,32.2279 +6324,2024-01-22 17:45:00-07:00,30.9583 +6325,2024-01-22 17:50:00-07:00,28.641 +6326,2024-01-22 17:55:00-07:00,27.1265 +6327,2024-01-22 18:00:00-07:00,26.4138 +6328,2024-01-22 18:05:00-07:00,26.9003 +6329,2024-01-22 18:10:00-07:00,26.2244 +6330,2024-01-22 18:15:00-07:00,25.3582 +6331,2024-01-22 18:20:00-07:00,25.1472 +6332,2024-01-22 18:25:00-07:00,24.9678 +6333,2024-01-22 18:30:00-07:00,24.9391 +6334,2024-01-22 18:35:00-07:00,24.8515 +6335,2024-01-22 18:40:00-07:00,24.822 +6336,2024-01-22 18:45:00-07:00,24.7653 +6337,2024-01-22 18:50:00-07:00,24.6473 +6338,2024-01-22 18:55:00-07:00,24.7102 +6339,2024-01-22 19:00:00-07:00,24.9336 +6340,2024-01-22 19:05:00-07:00,24.9052 +6341,2024-01-22 19:10:00-07:00,25.0579 +6342,2024-01-22 19:15:00-07:00,25.6218 +6343,2024-01-22 19:20:00-07:00,25.7902 +6344,2024-01-22 19:25:00-07:00,25.6959 +6345,2024-01-22 19:30:00-07:00,25.8025 +6346,2024-01-22 19:35:00-07:00,25.7896 +6347,2024-01-22 19:40:00-07:00,25.8372 +6348,2024-01-22 19:45:00-07:00,25.8283 +6349,2024-01-22 19:50:00-07:00,25.9508 +6350,2024-01-22 19:55:00-07:00,25.3068 +6351,2024-01-22 20:00:00-07:00,25.6585 +6352,2024-01-22 20:05:00-07:00,25.5531 +6353,2024-01-22 20:10:00-07:00,25.1884 +6354,2024-01-22 20:15:00-07:00,25.0879 +6355,2024-01-22 20:20:00-07:00,25.1045 +6356,2024-01-22 20:25:00-07:00,25.0738 +6357,2024-01-22 20:30:00-07:00,25.0389 +6358,2024-01-22 20:35:00-07:00,24.9319 +6359,2024-01-22 20:40:00-07:00,24.7954 +6360,2024-01-22 20:45:00-07:00,24.6119 +6361,2024-01-22 20:50:00-07:00,24.5923 +6362,2024-01-22 20:55:00-07:00,24.5734 +6363,2024-01-22 21:00:00-07:00,25.0112 +6364,2024-01-22 21:05:00-07:00,25.1929 +6365,2024-01-22 21:10:00-07:00,25.5324 +6366,2024-01-22 21:15:00-07:00,26.2856 +6367,2024-01-22 21:20:00-07:00,25.1577 +6368,2024-01-22 21:25:00-07:00,25.1411 +6369,2024-01-22 21:30:00-07:00,24.8646 +6370,2024-01-22 21:35:00-07:00,24.7665 +6371,2024-01-22 21:40:00-07:00,24.8351 +6372,2024-01-22 21:45:00-07:00,24.8334 +6373,2024-01-22 21:50:00-07:00,24.5975 +6374,2024-01-22 21:55:00-07:00,24.4525 +6375,2024-01-22 22:00:00-07:00,43.3985 +6376,2024-01-22 22:05:00-07:00,39.3428 +6377,2024-01-22 22:10:00-07:00,24.5304 +6378,2024-01-22 22:15:00-07:00,24.7058 +6379,2024-01-22 22:20:00-07:00,24.4895 +6380,2024-01-22 22:25:00-07:00,24.0898 +6381,2024-01-22 22:30:00-07:00,23.9747 +6382,2024-01-22 22:35:00-07:00,23.862 +6383,2024-01-22 22:40:00-07:00,23.7107 +6384,2024-01-22 22:45:00-07:00,23.3166 +6385,2024-01-22 22:50:00-07:00,22.8018 +6386,2024-01-22 22:55:00-07:00,20.3583 +6387,2024-01-22 23:00:00-07:00,23.5052 +6388,2024-01-22 23:05:00-07:00,23.3858 +6389,2024-01-22 23:10:00-07:00,18.9535 +6390,2024-01-22 23:15:00-07:00,19.4475 +6391,2024-01-22 23:20:00-07:00,18.9633 +6392,2024-01-22 23:25:00-07:00,19.305 +6393,2024-01-22 23:30:00-07:00,19.4751 +6394,2024-01-22 23:35:00-07:00,18.9605 +6395,2024-01-22 23:40:00-07:00,20.3322 +6396,2024-01-22 23:45:00-07:00,20.3546 +6397,2024-01-22 23:50:00-07:00,18.9938 +6398,2024-01-22 23:55:00-07:00,18.576 +6399,2024-01-23 00:00:00-07:00,18.0273 +6400,2024-01-23 00:05:00-07:00,18.7866 +6401,2024-01-23 00:10:00-07:00,18.9899 +6402,2024-01-23 00:15:00-07:00,19.3435 +6403,2024-01-23 00:20:00-07:00,19.5398 +6404,2024-01-23 00:25:00-07:00,19.5215 +6405,2024-01-23 00:30:00-07:00,19.5205 +6406,2024-01-23 00:35:00-07:00,19.4862 +6407,2024-01-23 00:40:00-07:00,19.4275 +6408,2024-01-23 00:45:00-07:00,19.3713 +6409,2024-01-23 00:50:00-07:00,19.3753 +6410,2024-01-23 00:55:00-07:00,19.4262 +6411,2024-01-23 01:00:00-07:00,19.5774 +6412,2024-01-23 01:05:00-07:00,18.9689 +6413,2024-01-23 01:10:00-07:00,18.5486 +6414,2024-01-23 01:15:00-07:00,18.6269 +6415,2024-01-23 01:20:00-07:00,18.7128 +6416,2024-01-23 01:25:00-07:00,18.2951 +6417,2024-01-23 01:30:00-07:00,18.0531 +6418,2024-01-23 01:35:00-07:00,18.6564 +6419,2024-01-23 01:40:00-07:00,18.4929 +6420,2024-01-23 01:45:00-07:00,18.3187 +6421,2024-01-23 01:50:00-07:00,18.2765 +6422,2024-01-23 01:55:00-07:00,18.1463 +6423,2024-01-23 02:00:00-07:00,18.163 +6424,2024-01-23 02:05:00-07:00,18.1783 +6425,2024-01-23 02:10:00-07:00,18.1218 +6426,2024-01-23 02:15:00-07:00,18.5853 +6427,2024-01-23 02:20:00-07:00,18.2004 +6428,2024-01-23 02:25:00-07:00,18.5574 +6429,2024-01-23 02:30:00-07:00,18.5512 +6430,2024-01-23 02:35:00-07:00,18.5725 +6431,2024-01-23 02:40:00-07:00,19.0283 +6432,2024-01-23 02:45:00-07:00,18.5834 +6433,2024-01-23 02:50:00-07:00,18.7283 +6434,2024-01-23 02:55:00-07:00,18.8022 +6435,2024-01-23 03:00:00-07:00,18.9968 +6436,2024-01-23 03:05:00-07:00,19.3461 +6437,2024-01-23 03:10:00-07:00,19.8752 +6438,2024-01-23 03:15:00-07:00,19.9123 +6439,2024-01-23 03:20:00-07:00,19.9412 +6440,2024-01-23 03:25:00-07:00,20.105 +6441,2024-01-23 03:30:00-07:00,20.0137 +6442,2024-01-23 03:35:00-07:00,20.1019 +6443,2024-01-23 03:40:00-07:00,20.226 +6444,2024-01-23 03:45:00-07:00,20.502 +6445,2024-01-23 03:50:00-07:00,20.4889 +6446,2024-01-23 03:55:00-07:00,20.5735 +6447,2024-01-23 04:00:00-07:00,21.343 +6448,2024-01-23 04:05:00-07:00,21.2146 +6449,2024-01-23 04:10:00-07:00,21.3831 +6450,2024-01-23 04:15:00-07:00,20.7855 +6451,2024-01-23 04:20:00-07:00,20.9135 +6452,2024-01-23 04:25:00-07:00,21.2889 +6453,2024-01-23 04:30:00-07:00,21.5465 +6454,2024-01-23 04:35:00-07:00,21.6543 +6455,2024-01-23 04:40:00-07:00,21.4817 +6456,2024-01-23 04:45:00-07:00,21.769 +6457,2024-01-23 04:50:00-07:00,23.4633 +6458,2024-01-23 04:55:00-07:00,23.5627 +6459,2024-01-23 05:00:00-07:00,23.7758 +6460,2024-01-23 05:05:00-07:00,23.869 +6461,2024-01-23 05:10:00-07:00,23.8477 +6462,2024-01-23 05:15:00-07:00,23.8138 +6463,2024-01-23 05:20:00-07:00,23.7756 +6464,2024-01-23 05:25:00-07:00,23.9056 +6465,2024-01-23 05:30:00-07:00,23.9636 +6466,2024-01-23 05:35:00-07:00,24.4303 +6467,2024-01-23 05:40:00-07:00,23.9651 +6468,2024-01-23 05:45:00-07:00,24.0432 +6469,2024-01-23 05:50:00-07:00,25.3935 +6470,2024-01-23 05:55:00-07:00,26.0457 +6471,2024-01-23 06:00:00-07:00,26.6739 +6472,2024-01-23 06:05:00-07:00,28.7065 +6473,2024-01-23 06:10:00-07:00,27.4793 +6474,2024-01-23 06:15:00-07:00,24.8268 +6475,2024-01-23 06:20:00-07:00,26.4268 +6476,2024-01-23 06:25:00-07:00,29.5772 +6477,2024-01-23 06:30:00-07:00,28.2586 +6478,2024-01-23 06:35:00-07:00,28.7296 +6479,2024-01-23 06:40:00-07:00,414.2743 +6480,2024-01-23 06:45:00-07:00,334.8009 +6481,2024-01-23 06:50:00-07:00,354.5523 +6482,2024-01-23 06:55:00-07:00,33.1254 +6483,2024-01-23 07:00:00-07:00,31.6267 +6484,2024-01-23 07:05:00-07:00,30.1037 +6485,2024-01-23 07:10:00-07:00,26.48 +6486,2024-01-23 07:15:00-07:00,27.1503 +6487,2024-01-23 07:20:00-07:00,27.2048 +6488,2024-01-23 07:25:00-07:00,28.0357 +6489,2024-01-23 07:30:00-07:00,27.1308 +6490,2024-01-23 07:35:00-07:00,26.3036 +6491,2024-01-23 07:40:00-07:00,26.0678 +6492,2024-01-23 07:45:00-07:00,23.6849 +6493,2024-01-23 07:50:00-07:00,22.1588 +6494,2024-01-23 07:55:00-07:00,22.9271 +6495,2024-01-23 08:00:00-07:00,20.9758 +6496,2024-01-23 08:05:00-07:00,21.3813 +6497,2024-01-23 08:10:00-07:00,18.0532 +6498,2024-01-23 08:15:00-07:00,15.3647 +6499,2024-01-23 08:20:00-07:00,15.4485 +6500,2024-01-23 08:25:00-07:00,16.2004 +6501,2024-01-23 08:30:00-07:00,16.958 +6502,2024-01-23 08:35:00-07:00,15.3388 +6503,2024-01-23 08:40:00-07:00,15.1227 +6504,2024-01-23 08:45:00-07:00,15.1017 +6505,2024-01-23 08:50:00-07:00,15.0339 +6506,2024-01-23 08:55:00-07:00,16.5778 +6507,2024-01-23 09:00:00-07:00,16.741 +6508,2024-01-23 09:05:00-07:00,17.667 +6509,2024-01-23 09:10:00-07:00,19.6595 +6510,2024-01-23 09:15:00-07:00,22.2051 +6511,2024-01-23 09:20:00-07:00,22.4875 +6512,2024-01-23 09:25:00-07:00,20.1174 +6513,2024-01-23 09:30:00-07:00,19.5556 +6514,2024-01-23 09:35:00-07:00,24.3431 +6515,2024-01-23 09:40:00-07:00,24.6382 +6516,2024-01-23 09:45:00-07:00,24.1225 +6517,2024-01-23 09:50:00-07:00,22.8735 +6518,2024-01-23 09:55:00-07:00,23.9234 +6519,2024-01-23 10:00:00-07:00,23.6858 +6520,2024-01-23 10:05:00-07:00,19.5529 +6521,2024-01-23 10:10:00-07:00,21.6544 +6522,2024-01-23 10:15:00-07:00,18.943 +6523,2024-01-23 10:20:00-07:00,18.8347 +6524,2024-01-23 10:25:00-07:00,15.5676 +6525,2024-01-23 10:30:00-07:00,17.9173 +6526,2024-01-23 10:35:00-07:00,17.2311 +6527,2024-01-23 10:40:00-07:00,16.9372 +6528,2024-01-23 10:45:00-07:00,17.7266 +6529,2024-01-23 10:50:00-07:00,18.1577 +6530,2024-01-23 10:55:00-07:00,17.4385 +6531,2024-01-23 11:00:00-07:00,17.6969 +6532,2024-01-23 11:05:00-07:00,17.595 +6533,2024-01-23 11:10:00-07:00,17.611 +6534,2024-01-23 11:15:00-07:00,17.9769 +6535,2024-01-23 11:20:00-07:00,17.4607 +6536,2024-01-23 11:25:00-07:00,17.4201 +6537,2024-01-23 11:30:00-07:00,17.2536 +6538,2024-01-23 11:35:00-07:00,17.9936 +6539,2024-01-23 11:40:00-07:00,17.7639 +6540,2024-01-23 11:45:00-07:00,17.6484 +6541,2024-01-23 11:50:00-07:00,17.9319 +6542,2024-01-23 11:55:00-07:00,18.0672 +6543,2024-01-23 12:00:00-07:00,18.2123 +6544,2024-01-23 12:05:00-07:00,17.9999 +6545,2024-01-23 12:10:00-07:00,17.5111 +6546,2024-01-23 12:15:00-07:00,17.7152 +6547,2024-01-23 12:20:00-07:00,17.7074 +6548,2024-01-23 12:25:00-07:00,17.7028 +6549,2024-01-23 12:30:00-07:00,17.6818 +6550,2024-01-23 12:35:00-07:00,17.7399 +6551,2024-01-23 12:40:00-07:00,17.6166 +6552,2024-01-23 12:45:00-07:00,17.6166 +6553,2024-01-23 12:50:00-07:00,17.8381 +6554,2024-01-23 12:55:00-07:00,17.9055 +6555,2024-01-23 13:00:00-07:00,17.8626 +6556,2024-01-23 13:05:00-07:00,17.9919 +6557,2024-01-23 13:10:00-07:00,17.8499 +6558,2024-01-23 13:15:00-07:00,17.8941 +6559,2024-01-23 13:20:00-07:00,17.8134 +6560,2024-01-23 13:25:00-07:00,17.8619 +6561,2024-01-23 13:30:00-07:00,17.8458 +6562,2024-01-23 13:35:00-07:00,17.8296 +6563,2024-01-23 13:40:00-07:00,17.8863 +6564,2024-01-23 13:45:00-07:00,17.9026 +6565,2024-01-23 13:50:00-07:00,17.8972 +6566,2024-01-23 13:55:00-07:00,17.9444 +6567,2024-01-23 14:00:00-07:00,17.8941 +6568,2024-01-23 14:05:00-07:00,18.1384 +6569,2024-01-23 14:10:00-07:00,17.8738 +6570,2024-01-23 14:15:00-07:00,17.8296 +6571,2024-01-23 14:20:00-07:00,17.6469 +6572,2024-01-23 14:25:00-07:00,17.514 +6573,2024-01-23 14:30:00-07:00,17.5611 +6574,2024-01-23 14:35:00-07:00,17.5265 +6575,2024-01-23 14:40:00-07:00,17.7196 +6576,2024-01-23 14:45:00-07:00,18.0465 +6577,2024-01-23 14:50:00-07:00,17.7173 +6578,2024-01-23 14:55:00-07:00,18.0807 +6579,2024-01-23 15:00:00-07:00,17.7926 +6580,2024-01-23 15:05:00-07:00,14.7854 +6581,2024-01-23 15:10:00-07:00,14.9212 +6582,2024-01-23 15:15:00-07:00,15.0904 +6583,2024-01-23 15:20:00-07:00,18.7739 +6584,2024-01-23 15:25:00-07:00,19.2886 +6585,2024-01-23 15:30:00-07:00,18.9355 +6586,2024-01-23 15:35:00-07:00,21.4718 +6587,2024-01-23 15:40:00-07:00,20.2203 +6588,2024-01-23 15:45:00-07:00,21.8774 +6589,2024-01-23 15:50:00-07:00,25.9544 +6590,2024-01-23 15:55:00-07:00,25.4605 +6591,2024-01-23 16:00:00-07:00,20.9076 +6592,2024-01-23 16:05:00-07:00,24.0483 +6593,2024-01-23 16:10:00-07:00,24.0894 +6594,2024-01-23 16:15:00-07:00,24.1335 +6595,2024-01-23 16:20:00-07:00,24.2786 +6596,2024-01-23 16:25:00-07:00,23.9191 +6597,2024-01-23 16:30:00-07:00,24.2318 +6598,2024-01-23 16:35:00-07:00,24.1824 +6599,2024-01-23 16:40:00-07:00,25.2565 +6600,2024-01-23 16:45:00-07:00,25.3475 +6601,2024-01-23 16:50:00-07:00,30.5806 +6602,2024-01-23 16:55:00-07:00,190.601 +6603,2024-01-23 17:00:00-07:00,24.5042 +6604,2024-01-23 17:05:00-07:00,25.5892 +6605,2024-01-23 17:10:00-07:00,25.6149 +6606,2024-01-23 17:15:00-07:00,25.5505 +6607,2024-01-23 17:20:00-07:00,29.8191 +6608,2024-01-23 17:25:00-07:00,28.5972 +6609,2024-01-23 17:30:00-07:00,28.2128 +6610,2024-01-23 17:35:00-07:00,28.7186 +6611,2024-01-23 17:40:00-07:00,27.3584 +6612,2024-01-23 17:45:00-07:00,25.7502 +6613,2024-01-23 17:50:00-07:00,25.6157 +6614,2024-01-23 17:55:00-07:00,25.9078 +6615,2024-01-23 18:00:00-07:00,26.2143 +6616,2024-01-23 18:05:00-07:00,26.3388 +6617,2024-01-23 18:10:00-07:00,25.7933 +6618,2024-01-23 18:15:00-07:00,23.079 +6619,2024-01-23 18:20:00-07:00,24.7053 +6620,2024-01-23 18:25:00-07:00,25.5572 +6621,2024-01-23 18:30:00-07:00,25.6527 +6622,2024-01-23 18:35:00-07:00,25.604 +6623,2024-01-23 18:40:00-07:00,25.9467 +6624,2024-01-23 18:45:00-07:00,26.2293 +6625,2024-01-23 18:50:00-07:00,26.2496 +6626,2024-01-23 18:55:00-07:00,25.7743 +6627,2024-01-23 19:00:00-07:00,26.6039 +6628,2024-01-23 19:05:00-07:00,26.9416 +6629,2024-01-23 19:10:00-07:00,27.7541 +6630,2024-01-23 19:15:00-07:00,27.6094 +6631,2024-01-23 19:20:00-07:00,28.4805 +6632,2024-01-23 19:25:00-07:00,29.4415 +6633,2024-01-23 19:30:00-07:00,29.6106 +6634,2024-01-23 19:35:00-07:00,29.6935 +6635,2024-01-23 19:40:00-07:00,30.0162 +6636,2024-01-23 19:45:00-07:00,141.5275 +6637,2024-01-23 19:50:00-07:00,29.075 +6638,2024-01-23 19:55:00-07:00,29.5843 +6639,2024-01-23 20:00:00-07:00,29.5837 +6640,2024-01-23 20:05:00-07:00,29.717 +6641,2024-01-23 20:10:00-07:00,29.7128 +6642,2024-01-23 20:15:00-07:00,29.7308 +6643,2024-01-23 20:20:00-07:00,29.4277 +6644,2024-01-23 20:25:00-07:00,29.0735 +6645,2024-01-23 20:30:00-07:00,28.9725 +6646,2024-01-23 20:35:00-07:00,28.3791 +6647,2024-01-23 20:40:00-07:00,27.7343 +6648,2024-01-23 20:45:00-07:00,28.009 +6649,2024-01-23 20:50:00-07:00,27.122 +6650,2024-01-23 20:55:00-07:00,27.0886 +6651,2024-01-23 21:00:00-07:00,27.756 +6652,2024-01-23 21:05:00-07:00,27.5982 +6653,2024-01-23 21:10:00-07:00,26.9768 +6654,2024-01-23 21:15:00-07:00,26.3115 +6655,2024-01-23 21:20:00-07:00,20.4621 +6656,2024-01-23 21:25:00-07:00,20.3621 +6657,2024-01-23 21:30:00-07:00,20.8493 +6658,2024-01-23 21:35:00-07:00,20.1589 +6659,2024-01-23 21:40:00-07:00,20.1861 +6660,2024-01-23 21:45:00-07:00,19.9181 +6661,2024-01-23 21:50:00-07:00,18.8615 +6662,2024-01-23 21:55:00-07:00,18.9971 +6663,2024-01-23 22:00:00-07:00,18.8992 +6664,2024-01-23 22:05:00-07:00,18.9286 +6665,2024-01-23 22:10:00-07:00,19.0484 +6666,2024-01-23 22:15:00-07:00,18.9295 +6667,2024-01-23 22:20:00-07:00,18.5778 +6668,2024-01-23 22:25:00-07:00,18.3874 +6669,2024-01-23 22:30:00-07:00,18.1098 +6670,2024-01-23 22:35:00-07:00,17.9939 +6671,2024-01-23 22:40:00-07:00,18.0008 +6672,2024-01-23 22:45:00-07:00,17.9 +6673,2024-01-23 22:50:00-07:00,18.0319 +6674,2024-01-23 22:55:00-07:00,19.2568 +6675,2024-01-23 23:00:00-07:00,21.4004 +6676,2024-01-23 23:05:00-07:00,21.4622 +6677,2024-01-23 23:10:00-07:00,21.423 +6678,2024-01-23 23:15:00-07:00,21.4526 +6679,2024-01-23 23:20:00-07:00,20.6507 +6680,2024-01-23 23:25:00-07:00,20.1944 +6681,2024-01-23 23:30:00-07:00,19.7118 +6682,2024-01-23 23:35:00-07:00,19.2581 +6683,2024-01-23 23:40:00-07:00,18.4557 +6684,2024-01-23 23:45:00-07:00,18.28 +6685,2024-01-23 23:50:00-07:00,18.1692 +6686,2024-01-23 23:55:00-07:00,17.8138 +6687,2024-01-24 00:00:00-07:00,18.1342 +6688,2024-01-24 00:05:00-07:00,18.5741 +6689,2024-01-24 00:10:00-07:00,18.5567 +6690,2024-01-24 00:15:00-07:00,18.5864 +6691,2024-01-24 00:20:00-07:00,18.5234 +6692,2024-01-24 00:25:00-07:00,20.1076 +6693,2024-01-24 00:30:00-07:00,20.8659 +6694,2024-01-24 00:35:00-07:00,21.3672 +6695,2024-01-24 00:40:00-07:00,21.5158 +6696,2024-01-24 00:45:00-07:00,21.7249 +6697,2024-01-24 00:50:00-07:00,21.7617 +6698,2024-01-24 00:55:00-07:00,22.4205 +6699,2024-01-24 01:00:00-07:00,23.0649 +6700,2024-01-24 01:05:00-07:00,22.6688 +6701,2024-01-24 01:10:00-07:00,22.4104 +6702,2024-01-24 01:15:00-07:00,21.9018 +6703,2024-01-24 01:20:00-07:00,22.4772 +6704,2024-01-24 01:25:00-07:00,21.9768 +6705,2024-01-24 01:30:00-07:00,21.6911 +6706,2024-01-24 01:35:00-07:00,21.8266 +6707,2024-01-24 01:40:00-07:00,21.8256 +6708,2024-01-24 01:45:00-07:00,21.7644 +6709,2024-01-24 01:50:00-07:00,21.6693 +6710,2024-01-24 01:55:00-07:00,21.6816 +6711,2024-01-24 02:00:00-07:00,21.7814 +6712,2024-01-24 02:05:00-07:00,22.0001 +6713,2024-01-24 02:10:00-07:00,22.1819 +6714,2024-01-24 02:15:00-07:00,22.1423 +6715,2024-01-24 02:20:00-07:00,22.015 +6716,2024-01-24 02:25:00-07:00,22.0612 +6717,2024-01-24 02:30:00-07:00,21.9776 +6718,2024-01-24 02:35:00-07:00,21.9755 +6719,2024-01-24 02:40:00-07:00,22.1789 +6720,2024-01-24 02:45:00-07:00,22.6009 +6721,2024-01-24 02:50:00-07:00,23.0016 +6722,2024-01-24 02:55:00-07:00,22.9272 +6723,2024-01-24 03:00:00-07:00,23.0399 +6724,2024-01-24 03:05:00-07:00,23.032 +6725,2024-01-24 03:10:00-07:00,23.1086 +6726,2024-01-24 03:15:00-07:00,23.118 +6727,2024-01-24 03:20:00-07:00,23.2466 +6728,2024-01-24 03:25:00-07:00,23.1394 +6729,2024-01-24 03:30:00-07:00,23.1405 +6730,2024-01-24 03:35:00-07:00,23.1972 +6731,2024-01-24 03:40:00-07:00,21.5018 +6732,2024-01-24 03:45:00-07:00,21.8903 +6733,2024-01-24 03:50:00-07:00,22.421 +6734,2024-01-24 03:55:00-07:00,22.5523 +6735,2024-01-24 04:00:00-07:00,22.7855 +6736,2024-01-24 04:05:00-07:00,22.7356 +6737,2024-01-24 04:10:00-07:00,22.8856 +6738,2024-01-24 04:15:00-07:00,22.8505 +6739,2024-01-24 04:20:00-07:00,22.3006 +6740,2024-01-24 04:25:00-07:00,22.0277 +6741,2024-01-24 04:30:00-07:00,21.7246 +6742,2024-01-24 04:35:00-07:00,21.6403 +6743,2024-01-24 04:40:00-07:00,21.9172 +6744,2024-01-24 04:45:00-07:00,21.6255 +6745,2024-01-24 04:50:00-07:00,22.0455 +6746,2024-01-24 04:55:00-07:00,22.221 +6747,2024-01-24 05:00:00-07:00,22.0309 +6748,2024-01-24 05:05:00-07:00,22.4412 +6749,2024-01-24 05:10:00-07:00,22.363 +6750,2024-01-24 05:15:00-07:00,22.0757 +6751,2024-01-24 05:20:00-07:00,21.6137 +6752,2024-01-24 05:25:00-07:00,21.6003 +6753,2024-01-24 05:30:00-07:00,21.5763 +6754,2024-01-24 05:35:00-07:00,21.4848 +6755,2024-01-24 05:40:00-07:00,21.4222 +6756,2024-01-24 05:45:00-07:00,20.9554 +6757,2024-01-24 05:50:00-07:00,22.485 +6758,2024-01-24 05:55:00-07:00,23.7503 +6759,2024-01-24 06:00:00-07:00,24.4742 +6760,2024-01-24 06:05:00-07:00,24.0715 +6761,2024-01-24 06:10:00-07:00,20.7179 +6762,2024-01-24 06:15:00-07:00,21.6401 +6763,2024-01-24 06:20:00-07:00,21.8572 +6764,2024-01-24 06:25:00-07:00,22.0404 +6765,2024-01-24 06:30:00-07:00,22.4517 +6766,2024-01-24 06:35:00-07:00,22.3072 +6767,2024-01-24 06:40:00-07:00,22.6992 +6768,2024-01-24 06:45:00-07:00,22.7536 +6769,2024-01-24 06:50:00-07:00,23.0567 +6770,2024-01-24 06:55:00-07:00,23.7186 +6771,2024-01-24 07:00:00-07:00,23.401 +6772,2024-01-24 07:05:00-07:00,23.4494 +6773,2024-01-24 07:10:00-07:00,23.7478 +6774,2024-01-24 07:15:00-07:00,23.8662 +6775,2024-01-24 07:20:00-07:00,23.6922 +6776,2024-01-24 07:25:00-07:00,23.5437 +6777,2024-01-24 07:30:00-07:00,23.1254 +6778,2024-01-24 07:35:00-07:00,22.3078 +6779,2024-01-24 07:40:00-07:00,21.9779 +6780,2024-01-24 07:45:00-07:00,21.664 +6781,2024-01-24 07:50:00-07:00,21.3035 +6782,2024-01-24 07:55:00-07:00,21.6833 +6783,2024-01-24 08:00:00-07:00,21.5226 +6784,2024-01-24 08:05:00-07:00,21.1868 +6785,2024-01-24 08:10:00-07:00,21.1755 +6786,2024-01-24 08:15:00-07:00,20.0404 +6787,2024-01-24 08:20:00-07:00,20.1836 +6788,2024-01-24 08:25:00-07:00,20.0224 +6789,2024-01-24 08:30:00-07:00,18.7922 +6790,2024-01-24 08:35:00-07:00,18.7645 +6791,2024-01-24 08:40:00-07:00,18.6966 +6792,2024-01-24 08:45:00-07:00,18.7352 +6793,2024-01-24 08:50:00-07:00,18.4696 +6794,2024-01-24 08:55:00-07:00,15.2784 +6795,2024-01-24 09:00:00-07:00,14.8885 +6796,2024-01-24 09:05:00-07:00,17.1904 +6797,2024-01-24 09:10:00-07:00,17.7225 +6798,2024-01-24 09:15:00-07:00,17.7764 +6799,2024-01-24 09:20:00-07:00,17.2611 +6800,2024-01-24 09:25:00-07:00,17.1857 +6801,2024-01-24 09:30:00-07:00,17.172 +6802,2024-01-24 09:35:00-07:00,15.095 +6803,2024-01-24 09:40:00-07:00,15.5246 +6804,2024-01-24 09:45:00-07:00,16.7581 +6805,2024-01-24 09:50:00-07:00,15.1882 +6806,2024-01-24 09:55:00-07:00,17.6226 +6807,2024-01-24 10:00:00-07:00,18.3409 +6808,2024-01-24 10:05:00-07:00,18.1506 +6809,2024-01-24 10:10:00-07:00,17.9484 +6810,2024-01-24 10:15:00-07:00,17.5798 +6811,2024-01-24 10:20:00-07:00,18.0102 +6812,2024-01-24 10:25:00-07:00,18.0137 +6813,2024-01-24 10:30:00-07:00,18.0021 +6814,2024-01-24 10:35:00-07:00,18.0792 +6815,2024-01-24 10:40:00-07:00,18.0909 +6816,2024-01-24 10:45:00-07:00,18.0007 +6817,2024-01-24 10:50:00-07:00,18.0281 +6818,2024-01-24 10:55:00-07:00,18.2473 +6819,2024-01-24 11:00:00-07:00,18.3876 +6820,2024-01-24 11:05:00-07:00,18.301 +6821,2024-01-24 11:10:00-07:00,18.3362 +6822,2024-01-24 11:15:00-07:00,18.3046 +6823,2024-01-24 11:20:00-07:00,18.385 +6824,2024-01-24 11:25:00-07:00,18.3781 +6825,2024-01-24 11:30:00-07:00,18.45 +6826,2024-01-24 11:35:00-07:00,18.4975 +6827,2024-01-24 11:40:00-07:00,18.5752 +6828,2024-01-24 11:45:00-07:00,18.595 +6829,2024-01-24 11:50:00-07:00,18.7107 +6830,2024-01-24 11:55:00-07:00,18.7319 +6831,2024-01-24 12:00:00-07:00,18.8208 +6832,2024-01-24 12:05:00-07:00,20.2383 +6833,2024-01-24 12:10:00-07:00,19.9496 +6834,2024-01-24 12:15:00-07:00,20.2501 +6835,2024-01-24 12:20:00-07:00,20.4696 +6836,2024-01-24 12:25:00-07:00,20.0403 +6837,2024-01-24 12:30:00-07:00,19.9908 +6838,2024-01-24 12:35:00-07:00,19.4694 +6839,2024-01-24 12:40:00-07:00,19.9862 +6840,2024-01-24 12:45:00-07:00,20.1399 +6841,2024-01-24 12:50:00-07:00,19.9989 +6842,2024-01-24 12:55:00-07:00,19.7177 +6843,2024-01-24 13:00:00-07:00,20.0238 +6844,2024-01-24 13:05:00-07:00,19.9206 +6845,2024-01-24 13:10:00-07:00,19.7698 +6846,2024-01-24 13:15:00-07:00,19.6774 +6847,2024-01-24 13:20:00-07:00,19.7394 +6848,2024-01-24 13:25:00-07:00,18.7742 +6849,2024-01-24 13:30:00-07:00,19.0766 +6850,2024-01-24 13:35:00-07:00,18.5386 +6851,2024-01-24 13:40:00-07:00,18.5706 +6852,2024-01-24 13:45:00-07:00,18.4677 +6853,2024-01-24 13:50:00-07:00,18.4246 +6854,2024-01-24 13:55:00-07:00,18.3658 +6855,2024-01-24 14:00:00-07:00,18.4394 +6856,2024-01-24 14:05:00-07:00,18.6328 +6857,2024-01-24 14:10:00-07:00,18.6379 +6858,2024-01-24 14:15:00-07:00,18.7319 +6859,2024-01-24 14:20:00-07:00,18.9651 +6860,2024-01-24 14:25:00-07:00,18.6769 +6861,2024-01-24 14:30:00-07:00,18.6857 +6862,2024-01-24 14:35:00-07:00,18.5629 +6863,2024-01-24 14:40:00-07:00,18.5075 +6864,2024-01-24 14:45:00-07:00,18.601 +6865,2024-01-24 14:50:00-07:00,19.0688 +6866,2024-01-24 14:55:00-07:00,18.7301 +6867,2024-01-24 15:00:00-07:00,19.4999 +6868,2024-01-24 15:05:00-07:00,19.2256 +6869,2024-01-24 15:10:00-07:00,18.614 +6870,2024-01-24 15:15:00-07:00,15.3895 +6871,2024-01-24 15:20:00-07:00,15.272 +6872,2024-01-24 15:25:00-07:00,17.2761 +6873,2024-01-24 15:30:00-07:00,18.3707 +6874,2024-01-24 15:35:00-07:00,18.6273 +6875,2024-01-24 15:40:00-07:00,20.3446 +6876,2024-01-24 15:45:00-07:00,19.4598 +6877,2024-01-24 15:50:00-07:00,20.2853 +6878,2024-01-24 15:55:00-07:00,21.9863 +6879,2024-01-24 16:00:00-07:00,18.7809 +6880,2024-01-24 16:05:00-07:00,19.913 +6881,2024-01-24 16:10:00-07:00,21.9371 +6882,2024-01-24 16:15:00-07:00,20.591 +6883,2024-01-24 16:20:00-07:00,20.9028 +6884,2024-01-24 16:25:00-07:00,21.5394 +6885,2024-01-24 16:30:00-07:00,21.694 +6886,2024-01-24 16:35:00-07:00,21.5396 +6887,2024-01-24 16:40:00-07:00,22.3581 +6888,2024-01-24 16:45:00-07:00,22.3472 +6889,2024-01-24 16:50:00-07:00,25.8423 +6890,2024-01-24 16:55:00-07:00,27.6011 +6891,2024-01-24 17:00:00-07:00,25.9003 +6892,2024-01-24 17:05:00-07:00,27.5055 +6893,2024-01-24 17:10:00-07:00,26.1081 +6894,2024-01-24 17:15:00-07:00,26.3439 +6895,2024-01-24 17:20:00-07:00,26.4127 +6896,2024-01-24 17:25:00-07:00,26.9093 +6897,2024-01-24 17:30:00-07:00,27.1701 +6898,2024-01-24 17:35:00-07:00,27.4235 +6899,2024-01-24 17:40:00-07:00,28.187 +6900,2024-01-24 17:45:00-07:00,28.6301 +6901,2024-01-24 17:50:00-07:00,28.4499 +6902,2024-01-24 17:55:00-07:00,371.0186 +6903,2024-01-24 18:00:00-07:00,547.6837 +6904,2024-01-24 18:05:00-07:00,580.7782 +6905,2024-01-24 18:10:00-07:00,24.0393 +6906,2024-01-24 18:15:00-07:00,23.1767 +6907,2024-01-24 18:20:00-07:00,23.3037 +6908,2024-01-24 18:25:00-07:00,23.4763 +6909,2024-01-24 18:30:00-07:00,23.6831 +6910,2024-01-24 18:35:00-07:00,23.5571 +6911,2024-01-24 18:40:00-07:00,23.749 +6912,2024-01-24 18:45:00-07:00,24.1548 +6913,2024-01-24 18:50:00-07:00,24.0476 +6914,2024-01-24 18:55:00-07:00,23.8379 +6915,2024-01-24 19:00:00-07:00,23.7323 +6916,2024-01-24 19:05:00-07:00,23.7411 +6917,2024-01-24 19:10:00-07:00,23.8057 +6918,2024-01-24 19:15:00-07:00,23.5231 +6919,2024-01-24 19:20:00-07:00,23.5851 +6920,2024-01-24 19:25:00-07:00,23.7239 +6921,2024-01-24 19:30:00-07:00,24.0001 +6922,2024-01-24 19:35:00-07:00,24.0721 +6923,2024-01-24 19:40:00-07:00,24.0253 +6924,2024-01-24 19:45:00-07:00,24.5711 +6925,2024-01-24 19:50:00-07:00,24.2495 +6926,2024-01-24 19:55:00-07:00,26.6895 +6927,2024-01-24 20:00:00-07:00,27.891 +6928,2024-01-24 20:05:00-07:00,25.9809 +6929,2024-01-24 20:10:00-07:00,27.9032 +6930,2024-01-24 20:15:00-07:00,423.6152 +6931,2024-01-24 20:20:00-07:00,410.4126 +6932,2024-01-24 20:25:00-07:00,25.0257 +6933,2024-01-24 20:30:00-07:00,24.5791 +6934,2024-01-24 20:35:00-07:00,24.4572 +6935,2024-01-24 20:40:00-07:00,24.1316 +6936,2024-01-24 20:45:00-07:00,24.0472 +6937,2024-01-24 20:50:00-07:00,23.0958 +6938,2024-01-24 20:55:00-07:00,23.2272 +6939,2024-01-24 21:00:00-07:00,23.2862 +6940,2024-01-24 21:05:00-07:00,490.6536 +6941,2024-01-24 21:10:00-07:00,365.2833 +6942,2024-01-24 21:15:00-07:00,445.7865 +6943,2024-01-24 21:20:00-07:00,25.5363 +6944,2024-01-24 21:25:00-07:00,23.9819 +6945,2024-01-24 21:30:00-07:00,23.7315 +6946,2024-01-24 21:35:00-07:00,23.5051 +6947,2024-01-24 21:40:00-07:00,23.2081 +6948,2024-01-24 21:45:00-07:00,22.6119 +6949,2024-01-24 21:50:00-07:00,22.1435 +6950,2024-01-24 21:55:00-07:00,22.063 +6951,2024-01-24 22:00:00-07:00,22.2093 +6952,2024-01-24 22:05:00-07:00,22.4255 +6953,2024-01-24 22:10:00-07:00,22.3602 +6954,2024-01-24 22:15:00-07:00,22.7707 +6955,2024-01-24 22:20:00-07:00,23.1971 +6956,2024-01-24 22:25:00-07:00,22.6162 +6957,2024-01-24 22:30:00-07:00,22.0258 +6958,2024-01-24 22:35:00-07:00,22.7558 +6959,2024-01-24 22:40:00-07:00,23.2909 +6960,2024-01-24 22:45:00-07:00,22.9472 +6961,2024-01-24 22:50:00-07:00,26.143 +6962,2024-01-24 22:55:00-07:00,24.0568 +6963,2024-01-24 23:00:00-07:00,23.7282 +6964,2024-01-24 23:05:00-07:00,24.0701 +6965,2024-01-24 23:10:00-07:00,23.9677 +6966,2024-01-24 23:15:00-07:00,23.7324 +6967,2024-01-24 23:20:00-07:00,23.5468 +6968,2024-01-24 23:25:00-07:00,23.0401 +6969,2024-01-24 23:30:00-07:00,22.7279 +6970,2024-01-24 23:35:00-07:00,23.025 +6971,2024-01-24 23:40:00-07:00,23.2474 +6972,2024-01-24 23:45:00-07:00,22.7286 +6973,2024-01-24 23:50:00-07:00,21.9221 +6974,2024-01-24 23:55:00-07:00,21.0327 +6975,2024-01-25 00:00:00-07:00,20.2872 +6976,2024-01-25 00:05:00-07:00,18.6478 +6977,2024-01-25 00:10:00-07:00,18.3759 +6978,2024-01-25 00:15:00-07:00,18.4305 +6979,2024-01-25 00:20:00-07:00,19.0669 +6980,2024-01-25 00:25:00-07:00,19.5361 +6981,2024-01-25 00:30:00-07:00,19.614 +6982,2024-01-25 00:35:00-07:00,19.5547 +6983,2024-01-25 00:40:00-07:00,20.4326 +6984,2024-01-25 00:45:00-07:00,20.6298 +6985,2024-01-25 00:50:00-07:00,20.6617 +6986,2024-01-25 00:55:00-07:00,21.0584 +6987,2024-01-25 01:00:00-07:00,22.3257 +6988,2024-01-25 01:05:00-07:00,21.6912 +6989,2024-01-25 01:10:00-07:00,22.1931 +6990,2024-01-25 01:15:00-07:00,21.9865 +6991,2024-01-25 01:20:00-07:00,21.5563 +6992,2024-01-25 01:25:00-07:00,21.4635 +6993,2024-01-25 01:30:00-07:00,21.5068 +6994,2024-01-25 01:35:00-07:00,21.6131 +6995,2024-01-25 01:40:00-07:00,21.5451 +6996,2024-01-25 01:45:00-07:00,21.3694 +6997,2024-01-25 01:50:00-07:00,21.4316 +6998,2024-01-25 01:55:00-07:00,20.8805 +6999,2024-01-25 02:00:00-07:00,20.7371 +7000,2024-01-25 02:05:00-07:00,20.8449 +7001,2024-01-25 02:10:00-07:00,20.869 +7002,2024-01-25 02:15:00-07:00,20.832 +7003,2024-01-25 02:20:00-07:00,20.9033 +7004,2024-01-25 02:25:00-07:00,21.053 +7005,2024-01-25 02:30:00-07:00,21.066 +7006,2024-01-25 02:35:00-07:00,21.0218 +7007,2024-01-25 02:40:00-07:00,21.4474 +7008,2024-01-25 02:45:00-07:00,21.4993 +7009,2024-01-25 02:50:00-07:00,21.2196 +7010,2024-01-25 02:55:00-07:00,21.5248 +7011,2024-01-25 03:00:00-07:00,21.6185 +7012,2024-01-25 03:05:00-07:00,21.3907 +7013,2024-01-25 03:10:00-07:00,21.7094 +7014,2024-01-25 03:15:00-07:00,21.5958 +7015,2024-01-25 03:20:00-07:00,21.0621 +7016,2024-01-25 03:25:00-07:00,21.0009 +7017,2024-01-25 03:30:00-07:00,21.0569 +7018,2024-01-25 03:35:00-07:00,21.6011 +7019,2024-01-25 03:40:00-07:00,20.8837 +7020,2024-01-25 03:45:00-07:00,20.876 +7021,2024-01-25 03:50:00-07:00,20.9163 +7022,2024-01-25 03:55:00-07:00,20.8081 +7023,2024-01-25 04:00:00-07:00,21.4252 +7024,2024-01-25 04:05:00-07:00,21.4325 +7025,2024-01-25 04:10:00-07:00,21.2511 +7026,2024-01-25 04:15:00-07:00,21.6831 +7027,2024-01-25 04:20:00-07:00,21.9127 +7028,2024-01-25 04:25:00-07:00,22.3662 +7029,2024-01-25 04:30:00-07:00,22.849 +7030,2024-01-25 04:35:00-07:00,22.6094 +7031,2024-01-25 04:40:00-07:00,23.6557 +7032,2024-01-25 04:45:00-07:00,24.549 +7033,2024-01-25 04:50:00-07:00,27.7746 +7034,2024-01-25 04:55:00-07:00,26.8626 +7035,2024-01-25 05:00:00-07:00,22.0901 +7036,2024-01-25 05:05:00-07:00,23.4494 +7037,2024-01-25 05:10:00-07:00,23.8591 +7038,2024-01-25 05:15:00-07:00,24.1233 +7039,2024-01-25 05:20:00-07:00,24.5772 +7040,2024-01-25 05:25:00-07:00,24.9287 +7041,2024-01-25 05:30:00-07:00,25.2372 +7042,2024-01-25 05:35:00-07:00,25.416 +7043,2024-01-25 05:40:00-07:00,26.0976 +7044,2024-01-25 05:45:00-07:00,27.1772 +7045,2024-01-25 05:50:00-07:00,29.9549 +7046,2024-01-25 05:55:00-07:00,29.9646 +7047,2024-01-25 06:00:00-07:00,29.9894 +7048,2024-01-25 06:05:00-07:00,29.9807 +7049,2024-01-25 06:10:00-07:00,29.93 +7050,2024-01-25 06:15:00-07:00,29.9028 +7051,2024-01-25 06:20:00-07:00,29.8732 +7052,2024-01-25 06:25:00-07:00,29.8882 +7053,2024-01-25 06:30:00-07:00,29.8954 +7054,2024-01-25 06:35:00-07:00,29.8927 +7055,2024-01-25 06:40:00-07:00,29.8268 +7056,2024-01-25 06:45:00-07:00,29.1952 +7057,2024-01-25 06:50:00-07:00,29.1759 +7058,2024-01-25 06:55:00-07:00,29.1508 +7059,2024-01-25 07:00:00-07:00,29.3447 +7060,2024-01-25 07:05:00-07:00,29.3241 +7061,2024-01-25 07:10:00-07:00,29.8846 +7062,2024-01-25 07:15:00-07:00,29.3822 +7063,2024-01-25 07:20:00-07:00,29.9084 +7064,2024-01-25 07:25:00-07:00,29.9118 +7065,2024-01-25 07:30:00-07:00,29.9438 +7066,2024-01-25 07:35:00-07:00,26.4948 +7067,2024-01-25 07:40:00-07:00,24.965 +7068,2024-01-25 07:45:00-07:00,24.2485 +7069,2024-01-25 07:50:00-07:00,22.4218 +7070,2024-01-25 07:55:00-07:00,22.2783 +7071,2024-01-25 08:00:00-07:00,21.7124 +7072,2024-01-25 08:05:00-07:00,21.3729 +7073,2024-01-25 08:10:00-07:00,21.1123 +7074,2024-01-25 08:15:00-07:00,21.3696 +7075,2024-01-25 08:20:00-07:00,20.6907 +7076,2024-01-25 08:25:00-07:00,20.229 +7077,2024-01-25 08:30:00-07:00,18.1644 +7078,2024-01-25 08:35:00-07:00,16.8589 +7079,2024-01-25 08:40:00-07:00,16.9498 +7080,2024-01-25 08:45:00-07:00,17.0398 +7081,2024-01-25 08:50:00-07:00,17.6278 +7082,2024-01-25 08:55:00-07:00,16.7335 +7083,2024-01-25 09:00:00-07:00,18.9941 +7084,2024-01-25 09:05:00-07:00,18.637 +7085,2024-01-25 09:10:00-07:00,19.814 +7086,2024-01-25 09:15:00-07:00,20.6135 +7087,2024-01-25 09:20:00-07:00,19.94 +7088,2024-01-25 09:25:00-07:00,19.3663 +7089,2024-01-25 09:30:00-07:00,19.336 +7090,2024-01-25 09:35:00-07:00,20.3327 +7091,2024-01-25 09:40:00-07:00,19.9257 +7092,2024-01-25 09:45:00-07:00,20.0004 +7093,2024-01-25 09:50:00-07:00,19.7236 +7094,2024-01-25 09:55:00-07:00,19.8095 +7095,2024-01-25 10:00:00-07:00,19.4397 +7096,2024-01-25 10:05:00-07:00,18.8966 +7097,2024-01-25 10:10:00-07:00,21.1057 +7098,2024-01-25 10:15:00-07:00,21.0637 +7099,2024-01-25 10:20:00-07:00,21.2275 +7100,2024-01-25 10:25:00-07:00,21.2951 +7101,2024-01-25 10:30:00-07:00,21.2296 +7102,2024-01-25 10:35:00-07:00,20.9666 +7103,2024-01-25 10:40:00-07:00,20.1538 +7104,2024-01-25 10:45:00-07:00,19.8868 +7105,2024-01-25 10:50:00-07:00,18.2468 +7106,2024-01-25 10:55:00-07:00,17.5519 +7107,2024-01-25 11:00:00-07:00,15.721 +7108,2024-01-25 11:05:00-07:00,17.0017 +7109,2024-01-25 11:10:00-07:00,18.6671 +7110,2024-01-25 11:15:00-07:00,18.7342 +7111,2024-01-25 11:20:00-07:00,18.2259 +7112,2024-01-25 11:25:00-07:00,19.1006 +7113,2024-01-25 11:30:00-07:00,17.1038 +7114,2024-01-25 11:35:00-07:00,17.4942 +7115,2024-01-25 11:40:00-07:00,17.1806 +7116,2024-01-25 11:45:00-07:00,18.5449 +7117,2024-01-25 11:50:00-07:00,18.3867 +7118,2024-01-25 11:55:00-07:00,19.267 +7119,2024-01-25 12:00:00-07:00,20.1829 +7120,2024-01-25 12:05:00-07:00,20.8466 +7121,2024-01-25 12:10:00-07:00,21.563 +7122,2024-01-25 12:15:00-07:00,20.4468 +7123,2024-01-25 12:20:00-07:00,20.179 +7124,2024-01-25 12:25:00-07:00,18.7117 +7125,2024-01-25 12:30:00-07:00,18.2473 +7126,2024-01-25 12:35:00-07:00,20.1683 +7127,2024-01-25 12:40:00-07:00,19.4282 +7128,2024-01-25 12:45:00-07:00,19.4189 +7129,2024-01-25 12:50:00-07:00,18.7685 +7130,2024-01-25 12:55:00-07:00,18.2274 +7131,2024-01-25 13:00:00-07:00,19.2751 +7132,2024-01-25 13:05:00-07:00,18.7804 +7133,2024-01-25 13:10:00-07:00,18.7854 +7134,2024-01-25 13:15:00-07:00,19.246 +7135,2024-01-25 13:20:00-07:00,19.9039 +7136,2024-01-25 13:25:00-07:00,19.65 +7137,2024-01-25 13:30:00-07:00,18.7808 +7138,2024-01-25 13:35:00-07:00,19.2471 +7139,2024-01-25 13:40:00-07:00,18.7601 +7140,2024-01-25 13:45:00-07:00,19.1111 +7141,2024-01-25 13:50:00-07:00,18.2197 +7142,2024-01-25 13:55:00-07:00,17.0068 +7143,2024-01-25 14:00:00-07:00,18.0333 +7144,2024-01-25 14:05:00-07:00,18.7077 +7145,2024-01-25 14:10:00-07:00,19.2677 +7146,2024-01-25 14:15:00-07:00,19.523 +7147,2024-01-25 14:20:00-07:00,20.0747 +7148,2024-01-25 14:25:00-07:00,20.1588 +7149,2024-01-25 14:30:00-07:00,20.918 +7150,2024-01-25 14:35:00-07:00,21.3473 +7151,2024-01-25 14:40:00-07:00,21.9599 +7152,2024-01-25 14:45:00-07:00,21.9697 +7153,2024-01-25 14:50:00-07:00,22.5667 +7154,2024-01-25 14:55:00-07:00,23.28 +7155,2024-01-25 15:00:00-07:00,22.2273 +7156,2024-01-25 15:05:00-07:00,21.6074 +7157,2024-01-25 15:10:00-07:00,17.1079 +7158,2024-01-25 15:15:00-07:00,21.4873 +7159,2024-01-25 15:20:00-07:00,21.3546 +7160,2024-01-25 15:25:00-07:00,20.62 +7161,2024-01-25 15:30:00-07:00,20.7757 +7162,2024-01-25 15:35:00-07:00,20.7486 +7163,2024-01-25 15:40:00-07:00,20.7549 +7164,2024-01-25 15:45:00-07:00,20.6019 +7165,2024-01-25 15:50:00-07:00,20.6243 +7166,2024-01-25 15:55:00-07:00,20.5532 +7167,2024-01-25 16:00:00-07:00,20.2152 +7168,2024-01-25 16:05:00-07:00,19.9734 +7169,2024-01-25 16:10:00-07:00,20.1963 +7170,2024-01-25 16:15:00-07:00,19.9691 +7171,2024-01-25 16:20:00-07:00,19.0378 +7172,2024-01-25 16:25:00-07:00,18.4125 +7173,2024-01-25 16:30:00-07:00,19.4996 +7174,2024-01-25 16:35:00-07:00,19.5183 +7175,2024-01-25 16:40:00-07:00,19.6304 +7176,2024-01-25 16:45:00-07:00,361.5856 +7177,2024-01-25 16:50:00-07:00,361.9685 +7178,2024-01-25 16:55:00-07:00,365.7472 +7179,2024-01-25 17:00:00-07:00,21.179 +7180,2024-01-25 17:05:00-07:00,21.1102 +7181,2024-01-25 17:10:00-07:00,20.6882 +7182,2024-01-25 17:15:00-07:00,20.6216 +7183,2024-01-25 17:20:00-07:00,21.3874 +7184,2024-01-25 17:25:00-07:00,21.1775 +7185,2024-01-25 17:30:00-07:00,20.7039 +7186,2024-01-25 17:35:00-07:00,20.445 +7187,2024-01-25 17:40:00-07:00,20.3937 +7188,2024-01-25 17:45:00-07:00,20.8275 +7189,2024-01-25 17:50:00-07:00,21.5295 +7190,2024-01-25 17:55:00-07:00,21.4694 +7191,2024-01-25 18:00:00-07:00,21.4301 +7192,2024-01-25 18:05:00-07:00,21.4756 +7193,2024-01-25 18:10:00-07:00,21.4415 +7194,2024-01-25 18:15:00-07:00,19.0852 +7195,2024-01-25 18:20:00-07:00,18.8993 +7196,2024-01-25 18:25:00-07:00,19.5443 +7197,2024-01-25 18:30:00-07:00,19.7137 +7198,2024-01-25 18:35:00-07:00,19.5141 +7199,2024-01-25 18:40:00-07:00,19.3366 +7200,2024-01-25 18:45:00-07:00,19.2253 +7201,2024-01-25 18:50:00-07:00,19.2072 +7202,2024-01-25 18:55:00-07:00,20.208 +7203,2024-01-25 19:00:00-07:00,19.8928 +7204,2024-01-25 19:05:00-07:00,19.5941 +7205,2024-01-25 19:10:00-07:00,19.0824 +7206,2024-01-25 19:15:00-07:00,18.4395 +7207,2024-01-25 19:20:00-07:00,18.4422 +7208,2024-01-25 19:25:00-07:00,17.3276 +7209,2024-01-25 19:30:00-07:00,15.7747 +7210,2024-01-25 19:35:00-07:00,15.8062 +7211,2024-01-25 19:40:00-07:00,16.9324 +7212,2024-01-25 19:45:00-07:00,17.1075 +7213,2024-01-25 19:50:00-07:00,15.8734 +7214,2024-01-25 19:55:00-07:00,16.9364 +7215,2024-01-25 20:00:00-07:00,20.499 +7216,2024-01-25 20:05:00-07:00,19.1599 +7217,2024-01-25 20:10:00-07:00,20.0644 +7218,2024-01-25 20:15:00-07:00,20.5612 +7219,2024-01-25 20:20:00-07:00,20.5507 +7220,2024-01-25 20:25:00-07:00,20.9109 +7221,2024-01-25 20:30:00-07:00,21.6555 +7222,2024-01-25 20:35:00-07:00,21.5862 +7223,2024-01-25 20:40:00-07:00,21.3822 +7224,2024-01-25 20:45:00-07:00,21.369 +7225,2024-01-25 20:50:00-07:00,20.7273 +7226,2024-01-25 20:55:00-07:00,21.388 +7227,2024-01-25 21:00:00-07:00,21.8117 +7228,2024-01-25 21:05:00-07:00,22.0188 +7229,2024-01-25 21:10:00-07:00,21.9266 +7230,2024-01-25 21:15:00-07:00,21.8777 +7231,2024-01-25 21:20:00-07:00,21.9723 +7232,2024-01-25 21:25:00-07:00,22.0887 +7233,2024-01-25 21:30:00-07:00,22.2256 +7234,2024-01-25 21:35:00-07:00,22.2045 +7235,2024-01-25 21:40:00-07:00,22.1973 +7236,2024-01-25 21:45:00-07:00,21.7875 +7237,2024-01-25 21:50:00-07:00,21.4173 +7238,2024-01-25 21:55:00-07:00,20.7345 +7239,2024-01-25 22:00:00-07:00,20.293 +7240,2024-01-25 22:05:00-07:00,21.2771 +7241,2024-01-25 22:10:00-07:00,22.7565 +7242,2024-01-25 22:15:00-07:00,23.9839 +7243,2024-01-25 22:20:00-07:00,23.6189 +7244,2024-01-25 22:25:00-07:00,23.4234 +7245,2024-01-25 22:30:00-07:00,23.385 +7246,2024-01-25 22:35:00-07:00,23.4899 +7247,2024-01-25 22:40:00-07:00,23.379 +7248,2024-01-25 22:45:00-07:00,23.2757 +7249,2024-01-25 22:50:00-07:00,22.854 +7250,2024-01-25 22:55:00-07:00,21.8345 +7251,2024-01-25 23:00:00-07:00,21.2514 +7252,2024-01-25 23:05:00-07:00,21.2345 +7253,2024-01-25 23:10:00-07:00,20.8999 +7254,2024-01-25 23:15:00-07:00,19.935 +7255,2024-01-25 23:20:00-07:00,19.8925 +7256,2024-01-25 23:25:00-07:00,19.8545 +7257,2024-01-25 23:30:00-07:00,19.8152 +7258,2024-01-25 23:35:00-07:00,19.5717 +7259,2024-01-25 23:40:00-07:00,19.4621 +7260,2024-01-25 23:45:00-07:00,19.3642 +7261,2024-01-25 23:50:00-07:00,18.9575 +7262,2024-01-25 23:55:00-07:00,19.8147 +7263,2024-01-26 00:00:00-07:00,20.6753 +7264,2024-01-26 00:05:00-07:00,19.8534 +7265,2024-01-26 00:10:00-07:00,19.5238 +7266,2024-01-26 00:15:00-07:00,19.5068 +7267,2024-01-26 00:20:00-07:00,19.249 +7268,2024-01-26 00:25:00-07:00,18.5461 +7269,2024-01-26 00:30:00-07:00,18.3915 +7270,2024-01-26 00:35:00-07:00,17.7237 +7271,2024-01-26 00:40:00-07:00,19.7516 +7272,2024-01-26 00:45:00-07:00,19.4694 +7273,2024-01-26 00:50:00-07:00,21.2222 +7274,2024-01-26 00:55:00-07:00,19.7436 +7275,2024-01-26 01:00:00-07:00,19.9294 +7276,2024-01-26 01:05:00-07:00,23.0022 +7277,2024-01-26 01:10:00-07:00,15.3093 +7278,2024-01-26 01:15:00-07:00,21.4004 +7279,2024-01-26 01:20:00-07:00,21.3327 +7280,2024-01-26 01:25:00-07:00,21.1937 +7281,2024-01-26 01:30:00-07:00,21.568 +7282,2024-01-26 01:35:00-07:00,21.4737 +7283,2024-01-26 01:40:00-07:00,22.368 +7284,2024-01-26 01:45:00-07:00,23.5079 +7285,2024-01-26 01:50:00-07:00,24.1086 +7286,2024-01-26 01:55:00-07:00,23.5742 +7287,2024-01-26 02:00:00-07:00,23.5456 +7288,2024-01-26 02:05:00-07:00,23.6107 +7289,2024-01-26 02:10:00-07:00,23.4962 +7290,2024-01-26 02:15:00-07:00,23.5427 +7291,2024-01-26 02:20:00-07:00,23.6623 +7292,2024-01-26 02:25:00-07:00,23.511 +7293,2024-01-26 02:30:00-07:00,23.4255 +7294,2024-01-26 02:35:00-07:00,23.0655 +7295,2024-01-26 02:40:00-07:00,22.9015 +7296,2024-01-26 02:45:00-07:00,22.4878 +7297,2024-01-26 02:50:00-07:00,22.5271 +7298,2024-01-26 02:55:00-07:00,22.2777 +7299,2024-01-26 03:00:00-07:00,23.1485 +7300,2024-01-26 03:05:00-07:00,23.0332 +7301,2024-01-26 03:10:00-07:00,22.8221 +7302,2024-01-26 03:15:00-07:00,22.8314 +7303,2024-01-26 03:20:00-07:00,22.8083 +7304,2024-01-26 03:25:00-07:00,22.8043 +7305,2024-01-26 03:30:00-07:00,22.0545 +7306,2024-01-26 03:35:00-07:00,21.7284 +7307,2024-01-26 03:40:00-07:00,21.5556 +7308,2024-01-26 03:45:00-07:00,21.4012 +7309,2024-01-26 03:50:00-07:00,21.5725 +7310,2024-01-26 03:55:00-07:00,21.4161 +7311,2024-01-26 04:00:00-07:00,21.3774 +7312,2024-01-26 04:05:00-07:00,21.348 +7313,2024-01-26 04:10:00-07:00,21.3184 +7314,2024-01-26 04:15:00-07:00,21.4776 +7315,2024-01-26 04:20:00-07:00,21.3506 +7316,2024-01-26 04:25:00-07:00,21.3453 +7317,2024-01-26 04:30:00-07:00,21.2599 +7318,2024-01-26 04:35:00-07:00,21.2872 +7319,2024-01-26 04:40:00-07:00,18.4445 +7320,2024-01-26 04:45:00-07:00,20.5667 +7321,2024-01-26 04:50:00-07:00,20.5445 +7322,2024-01-26 04:55:00-07:00,20.6975 +7323,2024-01-26 05:00:00-07:00,20.4717 +7324,2024-01-26 05:05:00-07:00,19.8708 +7325,2024-01-26 05:10:00-07:00,18.4133 +7326,2024-01-26 05:15:00-07:00,18.3827 +7327,2024-01-26 05:20:00-07:00,19.0744 +7328,2024-01-26 05:25:00-07:00,18.2851 +7329,2024-01-26 05:30:00-07:00,19.9984 +7330,2024-01-26 05:35:00-07:00,19.1415 +7331,2024-01-26 05:40:00-07:00,18.9185 +7332,2024-01-26 05:45:00-07:00,19.7755 +7333,2024-01-26 05:50:00-07:00,21.1544 +7334,2024-01-26 05:55:00-07:00,21.8135 +7335,2024-01-26 06:00:00-07:00,22.2418 +7336,2024-01-26 06:05:00-07:00,22.4295 +7337,2024-01-26 06:10:00-07:00,21.4579 +7338,2024-01-26 06:15:00-07:00,21.287 +7339,2024-01-26 06:20:00-07:00,21.2613 +7340,2024-01-26 06:25:00-07:00,21.4336 +7341,2024-01-26 06:30:00-07:00,21.6984 +7342,2024-01-26 06:35:00-07:00,21.6205 +7343,2024-01-26 06:40:00-07:00,21.6743 +7344,2024-01-26 06:45:00-07:00,22.1674 +7345,2024-01-26 06:50:00-07:00,22.4808 +7346,2024-01-26 06:55:00-07:00,22.6843 +7347,2024-01-26 07:00:00-07:00,27.1453 +7348,2024-01-26 07:05:00-07:00,23.1472 +7349,2024-01-26 07:10:00-07:00,28.5852 +7350,2024-01-26 07:15:00-07:00,23.5628 +7351,2024-01-26 07:20:00-07:00,25.0373 +7352,2024-01-26 07:25:00-07:00,32.081 +7353,2024-01-26 07:30:00-07:00,31.3322 +7354,2024-01-26 07:35:00-07:00,22.5512 +7355,2024-01-26 07:40:00-07:00,21.8965 +7356,2024-01-26 07:45:00-07:00,21.3517 +7357,2024-01-26 07:50:00-07:00,21.3221 +7358,2024-01-26 07:55:00-07:00,20.3491 +7359,2024-01-26 08:00:00-07:00,20.6049 +7360,2024-01-26 08:05:00-07:00,21.443 +7361,2024-01-26 08:10:00-07:00,21.4641 +7362,2024-01-26 08:15:00-07:00,19.8294 +7363,2024-01-26 08:20:00-07:00,18.3053 +7364,2024-01-26 08:25:00-07:00,17.0621 +7365,2024-01-26 08:30:00-07:00,21.9533 +7366,2024-01-26 08:35:00-07:00,20.4562 +7367,2024-01-26 08:40:00-07:00,20.2232 +7368,2024-01-26 08:45:00-07:00,20.053 +7369,2024-01-26 08:50:00-07:00,19.8893 +7370,2024-01-26 08:55:00-07:00,18.1097 +7371,2024-01-26 09:00:00-07:00,18.1134 +7372,2024-01-26 09:05:00-07:00,18.8902 +7373,2024-01-26 09:10:00-07:00,20.2629 +7374,2024-01-26 09:15:00-07:00,20.3092 +7375,2024-01-26 09:20:00-07:00,20.0169 +7376,2024-01-26 09:25:00-07:00,18.9018 +7377,2024-01-26 09:30:00-07:00,19.8069 +7378,2024-01-26 09:35:00-07:00,18.6053 +7379,2024-01-26 09:40:00-07:00,18.6658 +7380,2024-01-26 09:45:00-07:00,18.1005 +7381,2024-01-26 09:50:00-07:00,16.2094 +7382,2024-01-26 09:55:00-07:00,16.4334 +7383,2024-01-26 10:00:00-07:00,18.003 +7384,2024-01-26 10:05:00-07:00,18.4287 +7385,2024-01-26 10:10:00-07:00,18.4441 +7386,2024-01-26 10:15:00-07:00,19.3197 +7387,2024-01-26 10:20:00-07:00,19.2205 +7388,2024-01-26 10:25:00-07:00,19.2052 +7389,2024-01-26 10:30:00-07:00,19.2584 +7390,2024-01-26 10:35:00-07:00,19.295 +7391,2024-01-26 10:40:00-07:00,18.9102 +7392,2024-01-26 10:45:00-07:00,31.9942 +7393,2024-01-26 10:50:00-07:00,18.5164 +7394,2024-01-26 10:55:00-07:00,19.66 +7395,2024-01-26 11:00:00-07:00,19.057 +7396,2024-01-26 11:05:00-07:00,18.1779 +7397,2024-01-26 11:10:00-07:00,18.5117 +7398,2024-01-26 11:15:00-07:00,18.6035 +7399,2024-01-26 11:20:00-07:00,16.3112 +7400,2024-01-26 11:25:00-07:00,15.9753 +7401,2024-01-26 11:30:00-07:00,15.3009 +7402,2024-01-26 11:35:00-07:00,15.2605 +7403,2024-01-26 11:40:00-07:00,19.123 +7404,2024-01-26 11:45:00-07:00,18.1269 +7405,2024-01-26 11:50:00-07:00,15.9171 +7406,2024-01-26 11:55:00-07:00,14.4726 +7407,2024-01-26 12:00:00-07:00,14.359 +7408,2024-01-26 12:05:00-07:00,14.6448 +7409,2024-01-26 12:10:00-07:00,14.628 +7410,2024-01-26 12:15:00-07:00,15.1269 +7411,2024-01-26 12:20:00-07:00,14.9703 +7412,2024-01-26 12:25:00-07:00,14.7073 +7413,2024-01-26 12:30:00-07:00,14.1851 +7414,2024-01-26 12:35:00-07:00,14.3264 +7415,2024-01-26 12:40:00-07:00,14.2408 +7416,2024-01-26 12:45:00-07:00,14.4596 +7417,2024-01-26 12:50:00-07:00,17.6012 +7418,2024-01-26 12:55:00-07:00,17.5486 +7419,2024-01-26 13:00:00-07:00,14.3511 +7420,2024-01-26 13:05:00-07:00,14.5363 +7421,2024-01-26 13:10:00-07:00,14.5158 +7422,2024-01-26 13:15:00-07:00,14.5398 +7423,2024-01-26 13:20:00-07:00,14.3959 +7424,2024-01-26 13:25:00-07:00,17.2733 +7425,2024-01-26 13:30:00-07:00,21.6495 +7426,2024-01-26 13:35:00-07:00,16.6517 +7427,2024-01-26 13:40:00-07:00,14.5988 +7428,2024-01-26 13:45:00-07:00,14.6265 +7429,2024-01-26 13:50:00-07:00,14.5965 +7430,2024-01-26 13:55:00-07:00,14.4684 +7431,2024-01-26 14:00:00-07:00,14.2664 +7432,2024-01-26 14:05:00-07:00,14.3649 +7433,2024-01-26 14:10:00-07:00,18.8725 +7434,2024-01-26 14:15:00-07:00,14.4303 +7435,2024-01-26 14:20:00-07:00,13.6524 +7436,2024-01-26 14:25:00-07:00,0.1775 +7437,2024-01-26 14:30:00-07:00,12.365 +7438,2024-01-26 14:35:00-07:00,0.179 +7439,2024-01-26 14:40:00-07:00,12.4572 +7440,2024-01-26 14:45:00-07:00,12.6694 +7441,2024-01-26 14:50:00-07:00,12.6694 +7442,2024-01-26 14:55:00-07:00,12.1178 +7443,2024-01-26 15:00:00-07:00,0.1768 +7444,2024-01-26 15:05:00-07:00,0.1763 +7445,2024-01-26 15:10:00-07:00,11.3185 +7446,2024-01-26 15:15:00-07:00,13.3762 +7447,2024-01-26 15:20:00-07:00,12.8451 +7448,2024-01-26 15:25:00-07:00,13.5075 +7449,2024-01-26 15:30:00-07:00,13.8534 +7450,2024-01-26 15:35:00-07:00,13.961 +7451,2024-01-26 15:40:00-07:00,14.1521 +7452,2024-01-26 15:45:00-07:00,14.6203 +7453,2024-01-26 15:50:00-07:00,15.2893 +7454,2024-01-26 15:55:00-07:00,14.9734 +7455,2024-01-26 16:00:00-07:00,15.9644 +7456,2024-01-26 16:05:00-07:00,15.8691 +7457,2024-01-26 16:10:00-07:00,15.4526 +7458,2024-01-26 16:15:00-07:00,17.1416 +7459,2024-01-26 16:20:00-07:00,20.6333 +7460,2024-01-26 16:25:00-07:00,21.6878 +7461,2024-01-26 16:30:00-07:00,21.0974 +7462,2024-01-26 16:35:00-07:00,21.9949 +7463,2024-01-26 16:40:00-07:00,21.9725 +7464,2024-01-26 16:45:00-07:00,21.1508 +7465,2024-01-26 16:50:00-07:00,21.1131 +7466,2024-01-26 16:55:00-07:00,21.5012 +7467,2024-01-26 17:00:00-07:00,21.6784 +7468,2024-01-26 17:05:00-07:00,22.1113 +7469,2024-01-26 17:10:00-07:00,22.1369 +7470,2024-01-26 17:15:00-07:00,22.2764 +7471,2024-01-26 17:20:00-07:00,22.6261 +7472,2024-01-26 17:25:00-07:00,22.4753 +7473,2024-01-26 17:30:00-07:00,22.3195 +7474,2024-01-26 17:35:00-07:00,23.0051 +7475,2024-01-26 17:40:00-07:00,22.999 +7476,2024-01-26 17:45:00-07:00,23.2479 +7477,2024-01-26 17:50:00-07:00,24.3358 +7478,2024-01-26 17:55:00-07:00,24.343 +7479,2024-01-26 18:00:00-07:00,24.2509 +7480,2024-01-26 18:05:00-07:00,25.3156 +7481,2024-01-26 18:10:00-07:00,23.1827 +7482,2024-01-26 18:15:00-07:00,23.1546 +7483,2024-01-26 18:20:00-07:00,23.2905 +7484,2024-01-26 18:25:00-07:00,23.3064 +7485,2024-01-26 18:30:00-07:00,23.1138 +7486,2024-01-26 18:35:00-07:00,23.7973 +7487,2024-01-26 18:40:00-07:00,24.7328 +7488,2024-01-26 18:45:00-07:00,24.2901 +7489,2024-01-26 18:50:00-07:00,25.0784 +7490,2024-01-26 18:55:00-07:00,23.811 +7491,2024-01-26 19:00:00-07:00,23.7438 +7492,2024-01-26 19:05:00-07:00,186.9169 +7493,2024-01-26 19:10:00-07:00,236.8318 +7494,2024-01-26 19:15:00-07:00,25.0554 +7495,2024-01-26 19:20:00-07:00,23.8475 +7496,2024-01-26 19:25:00-07:00,23.611 +7497,2024-01-26 19:30:00-07:00,23.492 +7498,2024-01-26 19:35:00-07:00,23.2648 +7499,2024-01-26 19:40:00-07:00,23.1433 +7500,2024-01-26 19:45:00-07:00,22.9719 +7501,2024-01-26 19:50:00-07:00,22.776 +7502,2024-01-26 19:55:00-07:00,22.5673 +7503,2024-01-26 20:00:00-07:00,23.0206 +7504,2024-01-26 20:05:00-07:00,22.9444 +7505,2024-01-26 20:10:00-07:00,23.0623 +7506,2024-01-26 20:15:00-07:00,23.0865 +7507,2024-01-26 20:20:00-07:00,23.2451 +7508,2024-01-26 20:25:00-07:00,23.5887 +7509,2024-01-26 20:30:00-07:00,23.607 +7510,2024-01-26 20:35:00-07:00,23.546 +7511,2024-01-26 20:40:00-07:00,23.6956 +7512,2024-01-26 20:45:00-07:00,23.9617 +7513,2024-01-26 20:50:00-07:00,23.5972 +7514,2024-01-26 20:55:00-07:00,23.0926 +7515,2024-01-26 21:00:00-07:00,388.089 +7516,2024-01-26 21:05:00-07:00,24.3309 +7517,2024-01-26 21:10:00-07:00,22.8266 +7518,2024-01-26 21:15:00-07:00,22.5735 +7519,2024-01-26 21:20:00-07:00,22.3129 +7520,2024-01-26 21:25:00-07:00,22.232 +7521,2024-01-26 21:30:00-07:00,22.1703 +7522,2024-01-26 21:35:00-07:00,22.0643 +7523,2024-01-26 21:40:00-07:00,21.7323 +7524,2024-01-26 21:45:00-07:00,21.1018 +7525,2024-01-26 21:50:00-07:00,20.8634 +7526,2024-01-26 21:55:00-07:00,20.3499 +7527,2024-01-26 22:00:00-07:00,20.2824 +7528,2024-01-26 22:05:00-07:00,21.419 +7529,2024-01-26 22:10:00-07:00,21.4176 +7530,2024-01-26 22:15:00-07:00,21.3948 +7531,2024-01-26 22:20:00-07:00,21.2838 +7532,2024-01-26 22:25:00-07:00,21.5142 +7533,2024-01-26 22:30:00-07:00,21.4866 +7534,2024-01-26 22:35:00-07:00,21.5624 +7535,2024-01-26 22:40:00-07:00,21.8613 +7536,2024-01-26 22:45:00-07:00,21.8011 +7537,2024-01-26 22:50:00-07:00,21.7375 +7538,2024-01-26 22:55:00-07:00,22.6447 +7539,2024-01-26 23:00:00-07:00,24.5345 +7540,2024-01-26 23:05:00-07:00,23.4626 +7541,2024-01-26 23:10:00-07:00,23.4533 +7542,2024-01-26 23:15:00-07:00,23.2394 +7543,2024-01-26 23:20:00-07:00,17.0849 +7544,2024-01-26 23:25:00-07:00,18.9898 +7545,2024-01-26 23:30:00-07:00,21.1993 +7546,2024-01-26 23:35:00-07:00,21.0253 +7547,2024-01-26 23:40:00-07:00,19.7395 +7548,2024-01-26 23:45:00-07:00,19.3899 +7549,2024-01-26 23:50:00-07:00,19.6811 +7550,2024-01-26 23:55:00-07:00,18.6449 +7551,2024-01-27 00:00:00-07:00,19.6466 +7552,2024-01-27 00:05:00-07:00,19.6274 +7553,2024-01-27 00:10:00-07:00,19.5972 +7554,2024-01-27 00:15:00-07:00,19.4071 +7555,2024-01-27 00:20:00-07:00,18.4534 +7556,2024-01-27 00:25:00-07:00,17.6947 +7557,2024-01-27 00:30:00-07:00,16.4036 +7558,2024-01-27 00:35:00-07:00,16.0538 +7559,2024-01-27 00:40:00-07:00,15.6383 +7560,2024-01-27 00:45:00-07:00,15.4502 +7561,2024-01-27 00:50:00-07:00,15.4517 +7562,2024-01-27 00:55:00-07:00,15.3327 +7563,2024-01-27 01:00:00-07:00,15.5008 +7564,2024-01-27 01:05:00-07:00,15.4631 +7565,2024-01-27 01:10:00-07:00,15.3539 +7566,2024-01-27 01:15:00-07:00,15.3027 +7567,2024-01-27 01:20:00-07:00,15.2541 +7568,2024-01-27 01:25:00-07:00,15.2108 +7569,2024-01-27 01:30:00-07:00,15.2326 +7570,2024-01-27 01:35:00-07:00,15.2397 +7571,2024-01-27 01:40:00-07:00,14.9325 +7572,2024-01-27 01:45:00-07:00,14.7755 +7573,2024-01-27 01:50:00-07:00,14.6075 +7574,2024-01-27 01:55:00-07:00,15.0147 +7575,2024-01-27 02:00:00-07:00,15.5461 +7576,2024-01-27 02:05:00-07:00,15.4728 +7577,2024-01-27 02:10:00-07:00,15.3398 +7578,2024-01-27 02:15:00-07:00,15.298 +7579,2024-01-27 02:20:00-07:00,15.2542 +7580,2024-01-27 02:25:00-07:00,15.2653 +7581,2024-01-27 02:30:00-07:00,15.3147 +7582,2024-01-27 02:35:00-07:00,15.419 +7583,2024-01-27 02:40:00-07:00,15.4092 +7584,2024-01-27 02:45:00-07:00,15.3617 +7585,2024-01-27 02:50:00-07:00,15.3174 +7586,2024-01-27 02:55:00-07:00,15.2626 +7587,2024-01-27 03:00:00-07:00,15.2128 +7588,2024-01-27 03:05:00-07:00,15.0558 +7589,2024-01-27 03:10:00-07:00,14.9579 +7590,2024-01-27 03:15:00-07:00,14.8861 +7591,2024-01-27 03:20:00-07:00,14.8466 +7592,2024-01-27 03:25:00-07:00,14.7883 +7593,2024-01-27 03:30:00-07:00,14.6963 +7594,2024-01-27 03:35:00-07:00,14.7514 +7595,2024-01-27 03:40:00-07:00,14.7137 +7596,2024-01-27 03:45:00-07:00,14.6962 +7597,2024-01-27 03:50:00-07:00,14.7339 +7598,2024-01-27 03:55:00-07:00,14.7701 +7599,2024-01-27 04:00:00-07:00,14.7742 +7600,2024-01-27 04:05:00-07:00,14.8331 +7601,2024-01-27 04:10:00-07:00,14.922 +7602,2024-01-27 04:15:00-07:00,15.037 +7603,2024-01-27 04:20:00-07:00,15.1972 +7604,2024-01-27 04:25:00-07:00,15.3704 +7605,2024-01-27 04:30:00-07:00,15.5343 +7606,2024-01-27 04:35:00-07:00,15.9647 +7607,2024-01-27 04:40:00-07:00,15.2587 +7608,2024-01-27 04:45:00-07:00,15.3829 +7609,2024-01-27 04:50:00-07:00,15.5526 +7610,2024-01-27 04:55:00-07:00,15.6903 +7611,2024-01-27 05:00:00-07:00,15.5777 +7612,2024-01-27 05:05:00-07:00,15.6075 +7613,2024-01-27 05:10:00-07:00,15.5817 +7614,2024-01-27 05:15:00-07:00,15.6424 +7615,2024-01-27 05:20:00-07:00,15.6397 +7616,2024-01-27 05:25:00-07:00,15.7337 +7617,2024-01-27 05:30:00-07:00,15.597 +7618,2024-01-27 05:35:00-07:00,15.721 +7619,2024-01-27 05:40:00-07:00,15.8576 +7620,2024-01-27 05:45:00-07:00,16.1864 +7621,2024-01-27 05:50:00-07:00,19.3674 +7622,2024-01-27 05:55:00-07:00,19.5693 +7623,2024-01-27 06:00:00-07:00,19.0646 +7624,2024-01-27 06:05:00-07:00,18.9876 +7625,2024-01-27 06:10:00-07:00,18.128 +7626,2024-01-27 06:15:00-07:00,17.7348 +7627,2024-01-27 06:20:00-07:00,18.3963 +7628,2024-01-27 06:25:00-07:00,19.5985 +7629,2024-01-27 06:30:00-07:00,19.8034 +7630,2024-01-27 06:35:00-07:00,20.04 +7631,2024-01-27 06:40:00-07:00,20.0962 +7632,2024-01-27 06:45:00-07:00,20.1947 +7633,2024-01-27 06:50:00-07:00,20.0668 +7634,2024-01-27 06:55:00-07:00,20.01 +7635,2024-01-27 07:00:00-07:00,20.0721 +7636,2024-01-27 07:05:00-07:00,20.0073 +7637,2024-01-27 07:10:00-07:00,19.7667 +7638,2024-01-27 07:15:00-07:00,19.7189 +7639,2024-01-27 07:20:00-07:00,19.6476 +7640,2024-01-27 07:25:00-07:00,19.1651 +7641,2024-01-27 07:30:00-07:00,17.3861 +7642,2024-01-27 07:35:00-07:00,16.3991 +7643,2024-01-27 07:40:00-07:00,16.2148 +7644,2024-01-27 07:45:00-07:00,15.6322 +7645,2024-01-27 07:50:00-07:00,15.3053 +7646,2024-01-27 07:55:00-07:00,15.2326 +7647,2024-01-27 08:00:00-07:00,14.3048 +7648,2024-01-27 08:05:00-07:00,14.1497 +7649,2024-01-27 08:10:00-07:00,13.9357 +7650,2024-01-27 08:15:00-07:00,13.7193 +7651,2024-01-27 08:20:00-07:00,13.6499 +7652,2024-01-27 08:25:00-07:00,13.5219 +7653,2024-01-27 08:30:00-07:00,13.3939 +7654,2024-01-27 08:35:00-07:00,13.5684 +7655,2024-01-27 08:40:00-07:00,13.5052 +7656,2024-01-27 08:45:00-07:00,13.4696 +7657,2024-01-27 08:50:00-07:00,13.3431 +7658,2024-01-27 08:55:00-07:00,13.1304 +7659,2024-01-27 09:00:00-07:00,12.9502 +7660,2024-01-27 09:05:00-07:00,13.1093 +7661,2024-01-27 09:10:00-07:00,13.2864 +7662,2024-01-27 09:15:00-07:00,13.3458 +7663,2024-01-27 09:20:00-07:00,13.3126 +7664,2024-01-27 09:25:00-07:00,13.2925 +7665,2024-01-27 09:30:00-07:00,13.3156 +7666,2024-01-27 09:35:00-07:00,13.3652 +7667,2024-01-27 09:40:00-07:00,13.382 +7668,2024-01-27 09:45:00-07:00,13.3255 +7669,2024-01-27 09:50:00-07:00,13.2818 +7670,2024-01-27 09:55:00-07:00,13.3573 +7671,2024-01-27 10:00:00-07:00,13.4781 +7672,2024-01-27 10:05:00-07:00,13.389 +7673,2024-01-27 10:10:00-07:00,13.6591 +7674,2024-01-27 10:15:00-07:00,13.9583 +7675,2024-01-27 10:20:00-07:00,13.9572 +7676,2024-01-27 10:25:00-07:00,13.9928 +7677,2024-01-27 10:30:00-07:00,13.9009 +7678,2024-01-27 10:35:00-07:00,13.8478 +7679,2024-01-27 10:40:00-07:00,13.8069 +7680,2024-01-27 10:45:00-07:00,13.7982 +7681,2024-01-27 10:50:00-07:00,13.8448 +7682,2024-01-27 10:55:00-07:00,13.9991 +7683,2024-01-27 11:00:00-07:00,14.1094 +7684,2024-01-27 11:05:00-07:00,14.0108 +7685,2024-01-27 11:10:00-07:00,13.9967 +7686,2024-01-27 11:15:00-07:00,14.0925 +7687,2024-01-27 11:20:00-07:00,14.0948 +7688,2024-01-27 11:25:00-07:00,14.1776 +7689,2024-01-27 11:30:00-07:00,14.1989 +7690,2024-01-27 11:35:00-07:00,14.1875 +7691,2024-01-27 11:40:00-07:00,14.4417 +7692,2024-01-27 11:45:00-07:00,14.3376 +7693,2024-01-27 11:50:00-07:00,14.3543 +7694,2024-01-27 11:55:00-07:00,14.3521 +7695,2024-01-27 12:00:00-07:00,14.3943 +7696,2024-01-27 12:05:00-07:00,14.45 +7697,2024-01-27 12:10:00-07:00,14.5025 +7698,2024-01-27 12:15:00-07:00,14.5155 +7699,2024-01-27 12:20:00-07:00,14.6072 +7700,2024-01-27 12:25:00-07:00,14.6791 +7701,2024-01-27 12:30:00-07:00,14.6973 +7702,2024-01-27 12:35:00-07:00,14.6461 +7703,2024-01-27 12:40:00-07:00,14.6394 +7704,2024-01-27 12:45:00-07:00,14.6596 +7705,2024-01-27 12:50:00-07:00,14.6454 +7706,2024-01-27 12:55:00-07:00,14.5495 +7707,2024-01-27 13:00:00-07:00,14.5153 +7708,2024-01-27 13:05:00-07:00,14.5474 +7709,2024-01-27 13:10:00-07:00,14.5556 +7710,2024-01-27 13:15:00-07:00,14.5228 +7711,2024-01-27 13:20:00-07:00,14.4427 +7712,2024-01-27 13:25:00-07:00,14.4314 +7713,2024-01-27 13:30:00-07:00,14.3358 +7714,2024-01-27 13:35:00-07:00,14.3129 +7715,2024-01-27 13:40:00-07:00,14.111 +7716,2024-01-27 13:45:00-07:00,14.1665 +7717,2024-01-27 13:50:00-07:00,14.0918 +7718,2024-01-27 13:55:00-07:00,13.6975 +7719,2024-01-27 14:00:00-07:00,13.443 +7720,2024-01-27 14:05:00-07:00,13.4295 +7721,2024-01-27 14:10:00-07:00,13.3655 +7722,2024-01-27 14:15:00-07:00,13.3159 +7723,2024-01-27 14:20:00-07:00,13.27 +7724,2024-01-27 14:25:00-07:00,13.2035 +7725,2024-01-27 14:30:00-07:00,13.3085 +7726,2024-01-27 14:35:00-07:00,13.3838 +7727,2024-01-27 14:40:00-07:00,13.3453 +7728,2024-01-27 14:45:00-07:00,13.307 +7729,2024-01-27 14:50:00-07:00,13.3444 +7730,2024-01-27 14:55:00-07:00,13.2905 +7731,2024-01-27 15:00:00-07:00,13.3047 +7732,2024-01-27 15:05:00-07:00,13.3572 +7733,2024-01-27 15:10:00-07:00,13.3135 +7734,2024-01-27 15:15:00-07:00,13.1771 +7735,2024-01-27 15:20:00-07:00,13.347 +7736,2024-01-27 15:25:00-07:00,13.2905 +7737,2024-01-27 15:30:00-07:00,13.2479 +7738,2024-01-27 15:35:00-07:00,13.3649 +7739,2024-01-27 15:40:00-07:00,13.4991 +7740,2024-01-27 15:45:00-07:00,13.5161 +7741,2024-01-27 15:50:00-07:00,13.7916 +7742,2024-01-27 15:55:00-07:00,14.0427 +7743,2024-01-27 16:00:00-07:00,13.8976 +7744,2024-01-27 16:05:00-07:00,13.8607 +7745,2024-01-27 16:10:00-07:00,15.1086 +7746,2024-01-27 16:15:00-07:00,15.7362 +7747,2024-01-27 16:20:00-07:00,15.7502 +7748,2024-01-27 16:25:00-07:00,21.0072 +7749,2024-01-27 16:30:00-07:00,21.4763 +7750,2024-01-27 16:35:00-07:00,20.6064 +7751,2024-01-27 16:40:00-07:00,20.5561 +7752,2024-01-27 16:45:00-07:00,26.4104 +7753,2024-01-27 16:50:00-07:00,28.706 +7754,2024-01-27 16:55:00-07:00,26.8179 +7755,2024-01-27 17:00:00-07:00,25.4375 +7756,2024-01-27 17:05:00-07:00,24.1347 +7757,2024-01-27 17:10:00-07:00,20.5784 +7758,2024-01-27 17:15:00-07:00,21.5465 +7759,2024-01-27 17:20:00-07:00,23.5969 +7760,2024-01-27 17:25:00-07:00,23.5538 +7761,2024-01-27 17:30:00-07:00,23.4679 +7762,2024-01-27 17:35:00-07:00,23.5397 +7763,2024-01-27 17:40:00-07:00,23.0952 +7764,2024-01-27 17:45:00-07:00,22.2233 +7765,2024-01-27 17:50:00-07:00,21.8199 +7766,2024-01-27 17:55:00-07:00,21.689 +7767,2024-01-27 18:00:00-07:00,20.7755 +7768,2024-01-27 18:05:00-07:00,20.4091 +7769,2024-01-27 18:10:00-07:00,20.2925 +7770,2024-01-27 18:15:00-07:00,20.3493 +7771,2024-01-27 18:20:00-07:00,20.2472 +7772,2024-01-27 18:25:00-07:00,20.1078 +7773,2024-01-27 18:30:00-07:00,19.8432 +7774,2024-01-27 18:35:00-07:00,19.9071 +7775,2024-01-27 18:40:00-07:00,19.8947 +7776,2024-01-27 18:45:00-07:00,19.8466 +7777,2024-01-27 18:50:00-07:00,19.7998 +7778,2024-01-27 18:55:00-07:00,19.9246 +7779,2024-01-27 19:00:00-07:00,20.8085 +7780,2024-01-27 19:05:00-07:00,20.3443 +7781,2024-01-27 19:10:00-07:00,20.2517 +7782,2024-01-27 19:15:00-07:00,20.1541 +7783,2024-01-27 19:20:00-07:00,19.9682 +7784,2024-01-27 19:25:00-07:00,19.8593 +7785,2024-01-27 19:30:00-07:00,19.798 +7786,2024-01-27 19:35:00-07:00,19.9417 +7787,2024-01-27 19:40:00-07:00,19.914 +7788,2024-01-27 19:45:00-07:00,19.7148 +7789,2024-01-27 19:50:00-07:00,19.7948 +7790,2024-01-27 19:55:00-07:00,20.5363 +7791,2024-01-27 20:00:00-07:00,21.6735 +7792,2024-01-27 20:05:00-07:00,20.7595 +7793,2024-01-27 20:10:00-07:00,20.9886 +7794,2024-01-27 20:15:00-07:00,20.7664 +7795,2024-01-27 20:20:00-07:00,20.2477 +7796,2024-01-27 20:25:00-07:00,20.4334 +7797,2024-01-27 20:30:00-07:00,20.6647 +7798,2024-01-27 20:35:00-07:00,20.6696 +7799,2024-01-27 20:40:00-07:00,21.8254 +7800,2024-01-27 20:45:00-07:00,22.4189 +7801,2024-01-27 20:50:00-07:00,20.3111 +7802,2024-01-27 20:55:00-07:00,22.7422 +7803,2024-01-27 21:00:00-07:00,21.5833 +7804,2024-01-27 21:05:00-07:00,20.4239 +7805,2024-01-27 21:10:00-07:00,20.7837 +7806,2024-01-27 21:15:00-07:00,20.5713 +7807,2024-01-27 21:20:00-07:00,20.3181 +7808,2024-01-27 21:25:00-07:00,19.9376 +7809,2024-01-27 21:30:00-07:00,19.8627 +7810,2024-01-27 21:35:00-07:00,20.0862 +7811,2024-01-27 21:40:00-07:00,19.8213 +7812,2024-01-27 21:45:00-07:00,18.8343 +7813,2024-01-27 21:50:00-07:00,17.971 +7814,2024-01-27 21:55:00-07:00,18.129 +7815,2024-01-27 22:00:00-07:00,17.5938 +7816,2024-01-27 22:05:00-07:00,17.3358 +7817,2024-01-27 22:10:00-07:00,17.1675 +7818,2024-01-27 22:15:00-07:00,17.3447 +7819,2024-01-27 22:20:00-07:00,17.4943 +7820,2024-01-27 22:25:00-07:00,17.3116 +7821,2024-01-27 22:30:00-07:00,17.0629 +7822,2024-01-27 22:35:00-07:00,17.1003 +7823,2024-01-27 22:40:00-07:00,17.147 +7824,2024-01-27 22:45:00-07:00,16.1037 +7825,2024-01-27 22:50:00-07:00,15.4681 +7826,2024-01-27 22:55:00-07:00,17.5545 +7827,2024-01-27 23:00:00-07:00,18.0952 +7828,2024-01-27 23:05:00-07:00,17.8712 +7829,2024-01-27 23:10:00-07:00,17.3762 +7830,2024-01-27 23:15:00-07:00,17.3237 +7831,2024-01-27 23:20:00-07:00,17.4615 +7832,2024-01-27 23:25:00-07:00,17.1691 +7833,2024-01-27 23:30:00-07:00,17.077 +7834,2024-01-27 23:35:00-07:00,17.1502 +7835,2024-01-27 23:40:00-07:00,17.111 +7836,2024-01-27 23:45:00-07:00,17.291 +7837,2024-01-27 23:50:00-07:00,16.8854 +7838,2024-01-27 23:55:00-07:00,16.9315 +7839,2024-01-28 00:00:00-07:00,18.4914 +7840,2024-01-28 00:05:00-07:00,17.3795 +7841,2024-01-28 00:10:00-07:00,19.4554 +7842,2024-01-28 00:15:00-07:00,19.3621 +7843,2024-01-28 00:20:00-07:00,19.4644 +7844,2024-01-28 00:25:00-07:00,18.5493 +7845,2024-01-28 00:30:00-07:00,17.3866 +7846,2024-01-28 00:35:00-07:00,17.4198 +7847,2024-01-28 00:40:00-07:00,17.188 +7848,2024-01-28 00:45:00-07:00,15.4981 +7849,2024-01-28 00:50:00-07:00,15.0151 +7850,2024-01-28 00:55:00-07:00,14.8076 +7851,2024-01-28 01:00:00-07:00,14.9179 +7852,2024-01-28 01:05:00-07:00,14.3804 +7853,2024-01-28 01:10:00-07:00,14.5963 +7854,2024-01-28 01:15:00-07:00,14.6918 +7855,2024-01-28 01:20:00-07:00,14.7979 +7856,2024-01-28 01:25:00-07:00,14.6812 +7857,2024-01-28 01:30:00-07:00,14.7049 +7858,2024-01-28 01:35:00-07:00,14.7501 +7859,2024-01-28 01:40:00-07:00,14.7411 +7860,2024-01-28 01:45:00-07:00,14.7512 +7861,2024-01-28 01:50:00-07:00,14.7523 +7862,2024-01-28 01:55:00-07:00,14.8132 +7863,2024-01-28 02:00:00-07:00,14.8234 +7864,2024-01-28 02:05:00-07:00,16.3033 +7865,2024-01-28 02:10:00-07:00,15.3936 +7866,2024-01-28 02:15:00-07:00,15.4435 +7867,2024-01-28 02:20:00-07:00,14.9256 +7868,2024-01-28 02:25:00-07:00,15.0187 +7869,2024-01-28 02:30:00-07:00,14.7548 +7870,2024-01-28 02:35:00-07:00,14.7637 +7871,2024-01-28 02:40:00-07:00,14.7172 +7872,2024-01-28 02:45:00-07:00,14.3038 +7873,2024-01-28 02:50:00-07:00,14.1548 +7874,2024-01-28 02:55:00-07:00,14.1243 +7875,2024-01-28 03:00:00-07:00,14.0639 +7876,2024-01-28 03:05:00-07:00,14.0329 +7877,2024-01-28 03:10:00-07:00,14.0604 +7878,2024-01-28 03:15:00-07:00,14.1609 +7879,2024-01-28 03:20:00-07:00,14.0678 +7880,2024-01-28 03:25:00-07:00,14.1402 +7881,2024-01-28 03:30:00-07:00,14.1141 +7882,2024-01-28 03:35:00-07:00,13.9269 +7883,2024-01-28 03:40:00-07:00,13.8223 +7884,2024-01-28 03:45:00-07:00,13.8749 +7885,2024-01-28 03:50:00-07:00,13.8166 +7886,2024-01-28 03:55:00-07:00,13.9568 +7887,2024-01-28 04:00:00-07:00,14.0047 +7888,2024-01-28 04:05:00-07:00,14.1125 +7889,2024-01-28 04:10:00-07:00,14.0698 +7890,2024-01-28 04:15:00-07:00,14.0765 +7891,2024-01-28 04:20:00-07:00,13.9311 +7892,2024-01-28 04:25:00-07:00,13.6986 +7893,2024-01-28 04:30:00-07:00,13.5487 +7894,2024-01-28 04:35:00-07:00,13.5985 +7895,2024-01-28 04:40:00-07:00,13.578 +7896,2024-01-28 04:45:00-07:00,13.5258 +7897,2024-01-28 04:50:00-07:00,13.6662 +7898,2024-01-28 04:55:00-07:00,13.7838 +7899,2024-01-28 05:00:00-07:00,14.0376 +7900,2024-01-28 05:05:00-07:00,16.3137 +7901,2024-01-28 05:10:00-07:00,15.5593 +7902,2024-01-28 05:15:00-07:00,14.9055 +7903,2024-01-28 05:20:00-07:00,14.6845 +7904,2024-01-28 05:25:00-07:00,14.5355 +7905,2024-01-28 05:30:00-07:00,14.6191 +7906,2024-01-28 05:35:00-07:00,14.7673 +7907,2024-01-28 05:40:00-07:00,14.7225 +7908,2024-01-28 05:45:00-07:00,14.8293 +7909,2024-01-28 05:50:00-07:00,16.3711 +7910,2024-01-28 05:55:00-07:00,16.3691 +7911,2024-01-28 06:00:00-07:00,16.2767 +7912,2024-01-28 06:05:00-07:00,18.0843 +7913,2024-01-28 06:10:00-07:00,16.7027 +7914,2024-01-28 06:15:00-07:00,16.2318 +7915,2024-01-28 06:20:00-07:00,16.2103 +7916,2024-01-28 06:25:00-07:00,16.2672 +7917,2024-01-28 06:30:00-07:00,16.3146 +7918,2024-01-28 06:35:00-07:00,16.2566 +7919,2024-01-28 06:40:00-07:00,16.3473 +7920,2024-01-28 06:45:00-07:00,16.4971 +7921,2024-01-28 06:50:00-07:00,16.5087 +7922,2024-01-28 06:55:00-07:00,16.3535 +7923,2024-01-28 07:00:00-07:00,16.3984 +7924,2024-01-28 07:05:00-07:00,16.395 +7925,2024-01-28 07:10:00-07:00,16.375 +7926,2024-01-28 07:15:00-07:00,16.2171 +7927,2024-01-28 07:20:00-07:00,15.5821 +7928,2024-01-28 07:25:00-07:00,15.074 +7929,2024-01-28 07:30:00-07:00,14.8591 +7930,2024-01-28 07:35:00-07:00,14.7522 +7931,2024-01-28 07:40:00-07:00,14.6351 +7932,2024-01-28 07:45:00-07:00,14.4187 +7933,2024-01-28 07:50:00-07:00,13.9808 +7934,2024-01-28 07:55:00-07:00,13.6475 +7935,2024-01-28 08:00:00-07:00,13.6628 +7936,2024-01-28 08:05:00-07:00,13.6321 +7937,2024-01-28 08:10:00-07:00,13.7336 +7938,2024-01-28 08:15:00-07:00,13.7194 +7939,2024-01-28 08:20:00-07:00,13.4919 +7940,2024-01-28 08:25:00-07:00,13.3347 +7941,2024-01-28 08:30:00-07:00,13.3045 +7942,2024-01-28 08:35:00-07:00,13.0874 +7943,2024-01-28 08:40:00-07:00,12.8138 +7944,2024-01-28 08:45:00-07:00,12.552 +7945,2024-01-28 08:50:00-07:00,11.4564 +7946,2024-01-28 08:55:00-07:00,12.2463 +7947,2024-01-28 09:00:00-07:00,10.5462 +7948,2024-01-28 09:05:00-07:00,10.4383 +7949,2024-01-28 09:10:00-07:00,10.4398 +7950,2024-01-28 09:15:00-07:00,10.655 +7951,2024-01-28 09:20:00-07:00,10.5494 +7952,2024-01-28 09:25:00-07:00,10.2324 +7953,2024-01-28 09:30:00-07:00,0.1988 +7954,2024-01-28 09:35:00-07:00,10.2997 +7955,2024-01-28 09:40:00-07:00,10.4066 +7956,2024-01-28 09:45:00-07:00,10.3311 +7957,2024-01-28 09:50:00-07:00,10.3336 +7958,2024-01-28 09:55:00-07:00,0.1998 +7959,2024-01-28 10:00:00-07:00,10.2593 +7960,2024-01-28 10:05:00-07:00,10.5453 +7961,2024-01-28 10:10:00-07:00,10.6543 +7962,2024-01-28 10:15:00-07:00,10.4451 +7963,2024-01-28 10:20:00-07:00,10.3373 +7964,2024-01-28 10:25:00-07:00,0.1997 +7965,2024-01-28 10:30:00-07:00,0.1981 +7966,2024-01-28 10:35:00-07:00,0.1987 +7967,2024-01-28 10:40:00-07:00,0.1957 +7968,2024-01-28 10:45:00-07:00,0.1962 +7969,2024-01-28 10:50:00-07:00,0.1957 +7970,2024-01-28 10:55:00-07:00,0.2006 +7971,2024-01-28 11:00:00-07:00,0.2013 +7972,2024-01-28 11:05:00-07:00,0.1993 +7973,2024-01-28 11:10:00-07:00,0.1996 +7974,2024-01-28 11:15:00-07:00,9.6679 +7975,2024-01-28 11:20:00-07:00,0.1984 +7976,2024-01-28 11:25:00-07:00,0.1977 +7977,2024-01-28 11:30:00-07:00,0.1973 +7978,2024-01-28 11:35:00-07:00,9.5642 +7979,2024-01-28 11:40:00-07:00,10.3524 +7980,2024-01-28 11:45:00-07:00,0.2034 +7981,2024-01-28 11:50:00-07:00,0.1998 +7982,2024-01-28 11:55:00-07:00,0.2005 +7983,2024-01-28 12:00:00-07:00,0.206 +7984,2024-01-28 12:05:00-07:00,0.2004 +7985,2024-01-28 12:10:00-07:00,0.197 +7986,2024-01-28 12:15:00-07:00,0.1972 +7987,2024-01-28 12:20:00-07:00,0.1962 +7988,2024-01-28 12:25:00-07:00,0.1978 +7989,2024-01-28 12:30:00-07:00,0.1986 +7990,2024-01-28 12:35:00-07:00,0.1996 +7991,2024-01-28 12:40:00-07:00,0.1979 +7992,2024-01-28 12:45:00-07:00,0.1978 +7993,2024-01-28 12:50:00-07:00,0.1987 +7994,2024-01-28 12:55:00-07:00,0.1971 +7995,2024-01-28 13:00:00-07:00,0.199 +7996,2024-01-28 13:05:00-07:00,0.1968 +7997,2024-01-28 13:10:00-07:00,0.1957 +7998,2024-01-28 13:15:00-07:00,0.196 +7999,2024-01-28 13:20:00-07:00,0.1954 +8000,2024-01-28 13:25:00-07:00,0.194 +8001,2024-01-28 13:30:00-07:00,0.1903 +8002,2024-01-28 13:35:00-07:00,0.1929 +8003,2024-01-28 13:40:00-07:00,0.1945 +8004,2024-01-28 13:45:00-07:00,0.1945 +8005,2024-01-28 13:50:00-07:00,0.189 +8006,2024-01-28 13:55:00-07:00,0.1907 +8007,2024-01-28 14:00:00-07:00,0.1851 +8008,2024-01-28 14:05:00-07:00,0.1895 +8009,2024-01-28 14:10:00-07:00,0.1889 +8010,2024-01-28 14:15:00-07:00,0.1864 +8011,2024-01-28 14:20:00-07:00,0.1867 +8012,2024-01-28 14:25:00-07:00,0.1875 +8013,2024-01-28 14:30:00-07:00,0.1857 +8014,2024-01-28 14:35:00-07:00,0.1858 +8015,2024-01-28 14:40:00-07:00,0.1838 +8016,2024-01-28 14:45:00-07:00,0.1853 +8017,2024-01-28 14:50:00-07:00,0.1834 +8018,2024-01-28 14:55:00-07:00,10.4892 +8019,2024-01-28 15:00:00-07:00,9.7453 +8020,2024-01-28 15:05:00-07:00,0.186 +8021,2024-01-28 15:10:00-07:00,10.8075 +8022,2024-01-28 15:15:00-07:00,11.3342 +8023,2024-01-28 15:20:00-07:00,12.1787 +8024,2024-01-28 15:25:00-07:00,12.5925 +8025,2024-01-28 15:30:00-07:00,12.742 +8026,2024-01-28 15:35:00-07:00,13.0921 +8027,2024-01-28 15:40:00-07:00,13.2593 +8028,2024-01-28 15:45:00-07:00,13.291 +8029,2024-01-28 15:50:00-07:00,13.5285 +8030,2024-01-28 15:55:00-07:00,13.9963 +8031,2024-01-28 16:00:00-07:00,14.6444 +8032,2024-01-28 16:05:00-07:00,15.5184 +8033,2024-01-28 16:10:00-07:00,14.8173 +8034,2024-01-28 16:15:00-07:00,15.2963 +8035,2024-01-28 16:20:00-07:00,15.341 +8036,2024-01-28 16:25:00-07:00,16.2067 +8037,2024-01-28 16:30:00-07:00,19.2003 +8038,2024-01-28 16:35:00-07:00,20.5189 +8039,2024-01-28 16:40:00-07:00,21.1724 +8040,2024-01-28 16:45:00-07:00,20.1228 +8041,2024-01-28 16:50:00-07:00,21.169 +8042,2024-01-28 16:55:00-07:00,20.8837 +8043,2024-01-28 17:00:00-07:00,20.5813 +8044,2024-01-28 17:05:00-07:00,20.3217 +8045,2024-01-28 17:10:00-07:00,20.1882 +8046,2024-01-28 17:15:00-07:00,20.1206 +8047,2024-01-28 17:20:00-07:00,20.1134 +8048,2024-01-28 17:25:00-07:00,20.2931 +8049,2024-01-28 17:30:00-07:00,20.3094 +8050,2024-01-28 17:35:00-07:00,20.4449 +8051,2024-01-28 17:40:00-07:00,20.6608 +8052,2024-01-28 17:45:00-07:00,20.7599 +8053,2024-01-28 17:50:00-07:00,21.1337 +8054,2024-01-28 17:55:00-07:00,21.2044 +8055,2024-01-28 18:00:00-07:00,20.9478 +8056,2024-01-28 18:05:00-07:00,20.9595 +8057,2024-01-28 18:10:00-07:00,21.0086 +8058,2024-01-28 18:15:00-07:00,20.7514 +8059,2024-01-28 18:20:00-07:00,20.6788 +8060,2024-01-28 18:25:00-07:00,21.0015 +8061,2024-01-28 18:30:00-07:00,20.9064 +8062,2024-01-28 18:35:00-07:00,20.3448 +8063,2024-01-28 18:40:00-07:00,20.1348 +8064,2024-01-28 18:45:00-07:00,20.1079 +8065,2024-01-28 18:50:00-07:00,19.7758 +8066,2024-01-28 18:55:00-07:00,19.461 +8067,2024-01-28 19:00:00-07:00,19.0091 +8068,2024-01-28 19:05:00-07:00,19.1382 +8069,2024-01-28 19:10:00-07:00,19.4613 +8070,2024-01-28 19:15:00-07:00,19.1417 +8071,2024-01-28 19:20:00-07:00,18.8777 +8072,2024-01-28 19:25:00-07:00,18.6673 +8073,2024-01-28 19:30:00-07:00,17.7171 +8074,2024-01-28 19:35:00-07:00,16.7437 +8075,2024-01-28 19:40:00-07:00,15.5983 +8076,2024-01-28 19:45:00-07:00,15.5543 +8077,2024-01-28 19:50:00-07:00,15.7005 +8078,2024-01-28 19:55:00-07:00,15.5524 +8079,2024-01-28 20:00:00-07:00,18.092 +8080,2024-01-28 20:05:00-07:00,18.0307 +8081,2024-01-28 20:10:00-07:00,18.0392 +8082,2024-01-28 20:15:00-07:00,19.1 +8083,2024-01-28 20:20:00-07:00,17.9953 +8084,2024-01-28 20:25:00-07:00,17.0306 +8085,2024-01-28 20:30:00-07:00,14.7888 +8086,2024-01-28 20:35:00-07:00,15.4882 +8087,2024-01-28 20:40:00-07:00,15.4217 +8088,2024-01-28 20:45:00-07:00,16.6314 +8089,2024-01-28 20:50:00-07:00,15.0218 +8090,2024-01-28 20:55:00-07:00,16.2347 +8091,2024-01-28 21:00:00-07:00,17.3989 +8092,2024-01-28 21:05:00-07:00,18.5479 +8093,2024-01-28 21:10:00-07:00,18.7217 +8094,2024-01-28 21:15:00-07:00,18.5979 +8095,2024-01-28 21:20:00-07:00,17.666 +8096,2024-01-28 21:25:00-07:00,17.2636 +8097,2024-01-28 21:30:00-07:00,17.0574 +8098,2024-01-28 21:35:00-07:00,16.9816 +8099,2024-01-28 21:40:00-07:00,16.861 +8100,2024-01-28 21:45:00-07:00,17.358 +8101,2024-01-28 21:50:00-07:00,14.9085 +8102,2024-01-28 21:55:00-07:00,14.809 +8103,2024-01-28 22:00:00-07:00,14.7599 +8104,2024-01-28 22:05:00-07:00,14.9083 +8105,2024-01-28 22:10:00-07:00,15.9838 +8106,2024-01-28 22:15:00-07:00,15.2572 +8107,2024-01-28 22:20:00-07:00,14.9183 +8108,2024-01-28 22:25:00-07:00,14.9193 +8109,2024-01-28 22:30:00-07:00,14.8493 +8110,2024-01-28 22:35:00-07:00,14.7453 +8111,2024-01-28 22:40:00-07:00,14.6467 +8112,2024-01-28 22:45:00-07:00,14.6171 +8113,2024-01-28 22:50:00-07:00,14.5104 +8114,2024-01-28 22:55:00-07:00,14.6314 +8115,2024-01-28 23:00:00-07:00,14.6837 +8116,2024-01-28 23:05:00-07:00,14.639 +8117,2024-01-28 23:10:00-07:00,14.5432 +8118,2024-01-28 23:15:00-07:00,14.4141 +8119,2024-01-28 23:20:00-07:00,14.3687 +8120,2024-01-28 23:25:00-07:00,14.2893 +8121,2024-01-28 23:30:00-07:00,14.2555 +8122,2024-01-28 23:35:00-07:00,14.1478 +8123,2024-01-28 23:40:00-07:00,14.0831 +8124,2024-01-28 23:45:00-07:00,13.9252 +8125,2024-01-28 23:50:00-07:00,14.0211 +8126,2024-01-28 23:55:00-07:00,13.8529 +8127,2024-01-29 00:00:00-07:00,13.7604 +8128,2024-01-29 00:05:00-07:00,13.7563 +8129,2024-01-29 00:10:00-07:00,13.8045 +8130,2024-01-29 00:15:00-07:00,13.828 +8131,2024-01-29 00:20:00-07:00,14.4675 +8132,2024-01-29 00:25:00-07:00,14.1546 +8133,2024-01-29 00:30:00-07:00,13.9414 +8134,2024-01-29 00:35:00-07:00,13.9918 +8135,2024-01-29 00:40:00-07:00,13.6889 +8136,2024-01-29 00:45:00-07:00,14.0224 +8137,2024-01-29 00:50:00-07:00,13.6862 +8138,2024-01-29 00:55:00-07:00,13.8577 +8139,2024-01-29 01:00:00-07:00,14.4119 +8140,2024-01-29 01:05:00-07:00,14.0325 +8141,2024-01-29 01:10:00-07:00,14.1877 +8142,2024-01-29 01:15:00-07:00,14.1863 +8143,2024-01-29 01:20:00-07:00,14.2607 +8144,2024-01-29 01:25:00-07:00,14.2909 +8145,2024-01-29 01:30:00-07:00,14.2889 +8146,2024-01-29 01:35:00-07:00,14.2658 +8147,2024-01-29 01:40:00-07:00,14.3815 +8148,2024-01-29 01:45:00-07:00,14.3065 +8149,2024-01-29 01:50:00-07:00,14.4195 +8150,2024-01-29 01:55:00-07:00,14.6412 +8151,2024-01-29 02:00:00-07:00,14.7726 +8152,2024-01-29 02:05:00-07:00,15.0632 +8153,2024-01-29 02:10:00-07:00,15.9085 +8154,2024-01-29 02:15:00-07:00,16.3927 +8155,2024-01-29 02:20:00-07:00,17.0467 +8156,2024-01-29 02:25:00-07:00,17.3283 +8157,2024-01-29 02:30:00-07:00,18.4334 +8158,2024-01-29 02:35:00-07:00,18.3861 +8159,2024-01-29 02:40:00-07:00,18.3947 +8160,2024-01-29 02:45:00-07:00,18.4302 +8161,2024-01-29 02:50:00-07:00,18.3884 +8162,2024-01-29 02:55:00-07:00,15.5495 +8163,2024-01-29 03:00:00-07:00,15.0689 +8164,2024-01-29 03:05:00-07:00,15.4297 +8165,2024-01-29 03:10:00-07:00,15.4209 +8166,2024-01-29 03:15:00-07:00,16.4669 +8167,2024-01-29 03:20:00-07:00,17.1489 +8168,2024-01-29 03:25:00-07:00,14.9056 +8169,2024-01-29 03:30:00-07:00,14.7052 +8170,2024-01-29 03:35:00-07:00,14.5472 +8171,2024-01-29 03:40:00-07:00,14.3944 +8172,2024-01-29 03:45:00-07:00,14.2539 +8173,2024-01-29 03:50:00-07:00,14.133 +8174,2024-01-29 03:55:00-07:00,14.1203 +8175,2024-01-29 04:00:00-07:00,13.8818 +8176,2024-01-29 04:05:00-07:00,13.8546 +8177,2024-01-29 04:10:00-07:00,13.9893 +8178,2024-01-29 04:15:00-07:00,14.0851 +8179,2024-01-29 04:20:00-07:00,14.0222 +8180,2024-01-29 04:25:00-07:00,13.9356 +8181,2024-01-29 04:30:00-07:00,13.9291 +8182,2024-01-29 04:35:00-07:00,13.8667 +8183,2024-01-29 04:40:00-07:00,13.8642 +8184,2024-01-29 04:45:00-07:00,13.8264 +8185,2024-01-29 04:50:00-07:00,13.9312 +8186,2024-01-29 04:55:00-07:00,14.1951 +8187,2024-01-29 05:00:00-07:00,14.151 +8188,2024-01-29 05:05:00-07:00,14.1081 +8189,2024-01-29 05:10:00-07:00,14.1089 +8190,2024-01-29 05:15:00-07:00,14.0924 +8191,2024-01-29 05:20:00-07:00,14.0868 +8192,2024-01-29 05:25:00-07:00,14.1604 +8193,2024-01-29 05:30:00-07:00,14.1733 +8194,2024-01-29 05:35:00-07:00,14.2312 +8195,2024-01-29 05:40:00-07:00,14.3207 +8196,2024-01-29 05:45:00-07:00,14.4784 +8197,2024-01-29 05:50:00-07:00,15.0206 +8198,2024-01-29 05:55:00-07:00,22.8867 +8199,2024-01-29 06:00:00-07:00,23.7447 +8200,2024-01-29 06:05:00-07:00,23.0404 +8201,2024-01-29 06:10:00-07:00,20.4472 +8202,2024-01-29 06:15:00-07:00,20.2828 +8203,2024-01-29 06:20:00-07:00,20.9372 +8204,2024-01-29 06:25:00-07:00,21.3192 +8205,2024-01-29 06:30:00-07:00,21.3264 +8206,2024-01-29 06:35:00-07:00,21.1375 +8207,2024-01-29 06:40:00-07:00,21.4144 +8208,2024-01-29 06:45:00-07:00,21.6709 +8209,2024-01-29 06:50:00-07:00,21.6969 +8210,2024-01-29 06:55:00-07:00,21.9264 +8211,2024-01-29 07:00:00-07:00,21.4568 +8212,2024-01-29 07:05:00-07:00,21.5488 +8213,2024-01-29 07:10:00-07:00,21.5357 +8214,2024-01-29 07:15:00-07:00,21.5234 +8215,2024-01-29 07:20:00-07:00,21.27 +8216,2024-01-29 07:25:00-07:00,20.6212 +8217,2024-01-29 07:30:00-07:00,20.5403 +8218,2024-01-29 07:35:00-07:00,20.1693 +8219,2024-01-29 07:40:00-07:00,19.4454 +8220,2024-01-29 07:45:00-07:00,18.6989 +8221,2024-01-29 07:50:00-07:00,17.7911 +8222,2024-01-29 07:55:00-07:00,15.1767 +8223,2024-01-29 08:00:00-07:00,15.2859 +8224,2024-01-29 08:05:00-07:00,14.757 +8225,2024-01-29 08:10:00-07:00,14.757 +8226,2024-01-29 08:15:00-07:00,14.6309 +8227,2024-01-29 08:20:00-07:00,14.4536 +8228,2024-01-29 08:25:00-07:00,14.3548 +8229,2024-01-29 08:30:00-07:00,14.1937 +8230,2024-01-29 08:35:00-07:00,14.2463 +8231,2024-01-29 08:40:00-07:00,13.9956 +8232,2024-01-29 08:45:00-07:00,13.854 +8233,2024-01-29 08:50:00-07:00,13.6601 +8234,2024-01-29 08:55:00-07:00,13.5705 +8235,2024-01-29 09:00:00-07:00,13.8443 +8236,2024-01-29 09:05:00-07:00,13.6718 +8237,2024-01-29 09:10:00-07:00,13.5699 +8238,2024-01-29 09:15:00-07:00,13.6688 +8239,2024-01-29 09:20:00-07:00,13.9719 +8240,2024-01-29 09:25:00-07:00,13.7394 +8241,2024-01-29 09:30:00-07:00,13.753 +8242,2024-01-29 09:35:00-07:00,13.7574 +8243,2024-01-29 09:40:00-07:00,13.7472 +8244,2024-01-29 09:45:00-07:00,13.7846 +8245,2024-01-29 09:50:00-07:00,13.6264 +8246,2024-01-29 09:55:00-07:00,13.5829 +8247,2024-01-29 10:00:00-07:00,13.5738 +8248,2024-01-29 10:05:00-07:00,13.5581 +8249,2024-01-29 10:10:00-07:00,13.6099 +8250,2024-01-29 10:15:00-07:00,13.8339 +8251,2024-01-29 10:20:00-07:00,13.7434 +8252,2024-01-29 10:25:00-07:00,13.6036 +8253,2024-01-29 10:30:00-07:00,13.5528 +8254,2024-01-29 10:35:00-07:00,13.3897 +8255,2024-01-29 10:40:00-07:00,13.4746 +8256,2024-01-29 10:45:00-07:00,13.4059 +8257,2024-01-29 10:50:00-07:00,13.4659 +8258,2024-01-29 10:55:00-07:00,13.3197 +8259,2024-01-29 11:00:00-07:00,13.3135 +8260,2024-01-29 11:05:00-07:00,13.2478 +8261,2024-01-29 11:10:00-07:00,13.2174 +8262,2024-01-29 11:15:00-07:00,13.0367 +8263,2024-01-29 11:20:00-07:00,13.1363 +8264,2024-01-29 11:25:00-07:00,13.0702 +8265,2024-01-29 11:30:00-07:00,12.8156 +8266,2024-01-29 11:35:00-07:00,12.6151 +8267,2024-01-29 11:40:00-07:00,10.3881 +8268,2024-01-29 11:45:00-07:00,10.4319 +8269,2024-01-29 11:50:00-07:00,0.1856 +8270,2024-01-29 11:55:00-07:00,0.1813 +8271,2024-01-29 12:00:00-07:00,0.1844 +8272,2024-01-29 12:05:00-07:00,0.1835 +8273,2024-01-29 12:10:00-07:00,0.1892 +8274,2024-01-29 12:15:00-07:00,10.1148 +8275,2024-01-29 12:20:00-07:00,10.2884 +8276,2024-01-29 12:25:00-07:00,10.383 +8277,2024-01-29 12:30:00-07:00,10.301 +8278,2024-01-29 12:35:00-07:00,0.1867 +8279,2024-01-29 12:40:00-07:00,10.1352 +8280,2024-01-29 12:45:00-07:00,10.707 +8281,2024-01-29 12:50:00-07:00,11.0223 +8282,2024-01-29 12:55:00-07:00,11.8739 +8283,2024-01-29 13:00:00-07:00,11.9802 +8284,2024-01-29 13:05:00-07:00,11.7748 +8285,2024-01-29 13:10:00-07:00,11.1375 +8286,2024-01-29 13:15:00-07:00,11.4516 +8287,2024-01-29 13:20:00-07:00,12.0813 +8288,2024-01-29 13:25:00-07:00,12.6131 +8289,2024-01-29 13:30:00-07:00,12.6139 +8290,2024-01-29 13:35:00-07:00,12.6687 +8291,2024-01-29 13:40:00-07:00,12.7464 +8292,2024-01-29 13:45:00-07:00,12.5788 +8293,2024-01-29 13:50:00-07:00,12.4332 +8294,2024-01-29 13:55:00-07:00,11.4728 +8295,2024-01-29 14:00:00-07:00,0.1773 +8296,2024-01-29 14:05:00-07:00,10.3989 +8297,2024-01-29 14:10:00-07:00,10.5893 +8298,2024-01-29 14:15:00-07:00,10.7898 +8299,2024-01-29 14:20:00-07:00,10.5777 +8300,2024-01-29 14:25:00-07:00,10.3944 +8301,2024-01-29 14:30:00-07:00,10.2814 +8302,2024-01-29 14:35:00-07:00,0.1667 +8303,2024-01-29 14:40:00-07:00,10.1111 +8304,2024-01-29 14:45:00-07:00,0.1664 +8305,2024-01-29 14:50:00-07:00,0.1648 +8306,2024-01-29 14:55:00-07:00,10.0082 +8307,2024-01-29 15:00:00-07:00,11.3205 +8308,2024-01-29 15:05:00-07:00,11.9551 +8309,2024-01-29 15:10:00-07:00,11.2298 +8310,2024-01-29 15:15:00-07:00,11.5627 +8311,2024-01-29 15:20:00-07:00,12.0793 +8312,2024-01-29 15:25:00-07:00,12.7042 +8313,2024-01-29 15:30:00-07:00,12.846 +8314,2024-01-29 15:35:00-07:00,13.0942 +8315,2024-01-29 15:40:00-07:00,13.3305 +8316,2024-01-29 15:45:00-07:00,13.5685 +8317,2024-01-29 15:50:00-07:00,13.8935 +8318,2024-01-29 15:55:00-07:00,14.4332 +8319,2024-01-29 16:00:00-07:00,14.6754 +8320,2024-01-29 16:05:00-07:00,15.7253 +8321,2024-01-29 16:10:00-07:00,16.7612 +8322,2024-01-29 16:15:00-07:00,17.8683 +8323,2024-01-29 16:20:00-07:00,18.8202 +8324,2024-01-29 16:25:00-07:00,23.3788 +8325,2024-01-29 16:30:00-07:00,21.6592 +8326,2024-01-29 16:35:00-07:00,25.7004 +8327,2024-01-29 16:40:00-07:00,24.8685 +8328,2024-01-29 16:45:00-07:00,25.4484 +8329,2024-01-29 16:50:00-07:00,26.1813 +8330,2024-01-29 16:55:00-07:00,33.1128 +8331,2024-01-29 17:00:00-07:00,25.5275 +8332,2024-01-29 17:05:00-07:00,26.0375 +8333,2024-01-29 17:10:00-07:00,24.7118 +8334,2024-01-29 17:15:00-07:00,21.955 +8335,2024-01-29 17:20:00-07:00,23.7769 +8336,2024-01-29 17:25:00-07:00,24.4968 +8337,2024-01-29 17:30:00-07:00,21.9486 +8338,2024-01-29 17:35:00-07:00,22.519 +8339,2024-01-29 17:40:00-07:00,22.7257 +8340,2024-01-29 17:45:00-07:00,22.5451 +8341,2024-01-29 17:50:00-07:00,23.3406 +8342,2024-01-29 17:55:00-07:00,23.7105 +8343,2024-01-29 18:00:00-07:00,23.0788 +8344,2024-01-29 18:05:00-07:00,22.0752 +8345,2024-01-29 18:10:00-07:00,21.9648 +8346,2024-01-29 18:15:00-07:00,21.7446 +8347,2024-01-29 18:20:00-07:00,21.796 +8348,2024-01-29 18:25:00-07:00,21.6525 +8349,2024-01-29 18:30:00-07:00,21.1036 +8350,2024-01-29 18:35:00-07:00,21.5158 +8351,2024-01-29 18:40:00-07:00,21.4414 +8352,2024-01-29 18:45:00-07:00,20.5794 +8353,2024-01-29 18:50:00-07:00,19.182 +8354,2024-01-29 18:55:00-07:00,18.2673 +8355,2024-01-29 19:00:00-07:00,16.6536 +8356,2024-01-29 19:05:00-07:00,16.6592 +8357,2024-01-29 19:10:00-07:00,18.9441 +8358,2024-01-29 19:15:00-07:00,18.6559 +8359,2024-01-29 19:20:00-07:00,18.2036 +8360,2024-01-29 19:25:00-07:00,17.7455 +8361,2024-01-29 19:30:00-07:00,18.1149 +8362,2024-01-29 19:35:00-07:00,18.1609 +8363,2024-01-29 19:40:00-07:00,18.1969 +8364,2024-01-29 19:45:00-07:00,17.9778 +8365,2024-01-29 19:50:00-07:00,17.9807 +8366,2024-01-29 19:55:00-07:00,17.8236 +8367,2024-01-29 20:00:00-07:00,17.915 +8368,2024-01-29 20:05:00-07:00,17.9688 +8369,2024-01-29 20:10:00-07:00,17.6316 +8370,2024-01-29 20:15:00-07:00,17.6426 +8371,2024-01-29 20:20:00-07:00,17.9684 +8372,2024-01-29 20:25:00-07:00,17.688 +8373,2024-01-29 20:30:00-07:00,17.6325 +8374,2024-01-29 20:35:00-07:00,17.2907 +8375,2024-01-29 20:40:00-07:00,16.0427 +8376,2024-01-29 20:45:00-07:00,16.1457 +8377,2024-01-29 20:50:00-07:00,18.5537 +8378,2024-01-29 20:55:00-07:00,13.6472 +8379,2024-01-29 21:00:00-07:00,15.7958 +8380,2024-01-29 21:05:00-07:00,15.9079 +8381,2024-01-29 21:10:00-07:00,15.2825 +8382,2024-01-29 21:15:00-07:00,16.4195 +8383,2024-01-29 21:20:00-07:00,18.9066 +8384,2024-01-29 21:25:00-07:00,17.7904 +8385,2024-01-29 21:30:00-07:00,23.3548 +8386,2024-01-29 21:35:00-07:00,18.1108 +8387,2024-01-29 21:40:00-07:00,19.8997 +8388,2024-01-29 21:45:00-07:00,19.0579 +8389,2024-01-29 21:50:00-07:00,19.0767 +8390,2024-01-29 21:55:00-07:00,19.0033 +8391,2024-01-29 22:00:00-07:00,20.0094 +8392,2024-01-29 22:05:00-07:00,20.7812 +8393,2024-01-29 22:10:00-07:00,21.0131 +8394,2024-01-29 22:15:00-07:00,21.3135 +8395,2024-01-29 22:20:00-07:00,20.5205 +8396,2024-01-29 22:25:00-07:00,20.8605 +8397,2024-01-29 22:30:00-07:00,20.8218 +8398,2024-01-29 22:35:00-07:00,20.7317 +8399,2024-01-29 22:40:00-07:00,20.6982 +8400,2024-01-29 22:45:00-07:00,20.3109 +8401,2024-01-29 22:50:00-07:00,20.1155 +8402,2024-01-29 22:55:00-07:00,20.2117 +8403,2024-01-29 23:00:00-07:00,20.9998 +8404,2024-01-29 23:05:00-07:00,21.4747 +8405,2024-01-29 23:10:00-07:00,18.5574 +8406,2024-01-29 23:15:00-07:00,17.3593 +8407,2024-01-29 23:20:00-07:00,18.9554 +8408,2024-01-29 23:25:00-07:00,19.0185 +8409,2024-01-29 23:30:00-07:00,17.925 +8410,2024-01-29 23:35:00-07:00,17.9147 +8411,2024-01-29 23:40:00-07:00,17.0974 +8412,2024-01-29 23:45:00-07:00,17.3659 +8413,2024-01-29 23:50:00-07:00,17.393 +8414,2024-01-29 23:55:00-07:00,15.2096 +8415,2024-01-30 00:00:00-07:00,17.2306 +8416,2024-01-30 00:05:00-07:00,18.488 +8417,2024-01-30 00:10:00-07:00,19.0131 +8418,2024-01-30 00:15:00-07:00,18.9829 +8419,2024-01-30 00:20:00-07:00,19.8949 +8420,2024-01-30 00:25:00-07:00,18.9463 +8421,2024-01-30 00:30:00-07:00,18.8884 +8422,2024-01-30 00:35:00-07:00,18.8703 +8423,2024-01-30 00:40:00-07:00,18.9011 +8424,2024-01-30 00:45:00-07:00,19.1119 +8425,2024-01-30 00:50:00-07:00,18.8665 +8426,2024-01-30 00:55:00-07:00,18.6911 +8427,2024-01-30 01:00:00-07:00,18.1365 +8428,2024-01-30 01:05:00-07:00,18.5947 +8429,2024-01-30 01:10:00-07:00,18.5898 +8430,2024-01-30 01:15:00-07:00,18.5571 +8431,2024-01-30 01:20:00-07:00,18.5312 +8432,2024-01-30 01:25:00-07:00,18.4185 +8433,2024-01-30 01:30:00-07:00,18.0696 +8434,2024-01-30 01:35:00-07:00,17.1172 +8435,2024-01-30 01:40:00-07:00,18.3985 +8436,2024-01-30 01:45:00-07:00,17.9439 +8437,2024-01-30 01:50:00-07:00,16.979 +8438,2024-01-30 01:55:00-07:00,16.2992 +8439,2024-01-30 02:00:00-07:00,16.1793 +8440,2024-01-30 02:05:00-07:00,15.7049 +8441,2024-01-30 02:10:00-07:00,22.2831 +8442,2024-01-30 02:15:00-07:00,18.5146 +8443,2024-01-30 02:20:00-07:00,18.6915 +8444,2024-01-30 02:25:00-07:00,18.648 +8445,2024-01-30 02:30:00-07:00,18.7157 +8446,2024-01-30 02:35:00-07:00,19.5064 +8447,2024-01-30 02:40:00-07:00,18.8675 +8448,2024-01-30 02:45:00-07:00,18.8895 +8449,2024-01-30 02:50:00-07:00,18.8716 +8450,2024-01-30 02:55:00-07:00,18.8331 +8451,2024-01-30 03:00:00-07:00,21.3116 +8452,2024-01-30 03:05:00-07:00,19.9949 +8453,2024-01-30 03:10:00-07:00,19.7696 +8454,2024-01-30 03:15:00-07:00,18.7645 +8455,2024-01-30 03:20:00-07:00,18.9608 +8456,2024-01-30 03:25:00-07:00,18.9943 +8457,2024-01-30 03:30:00-07:00,19.0888 +8458,2024-01-30 03:35:00-07:00,18.9967 +8459,2024-01-30 03:40:00-07:00,18.9527 +8460,2024-01-30 03:45:00-07:00,19.0758 +8461,2024-01-30 03:50:00-07:00,19.0314 +8462,2024-01-30 03:55:00-07:00,19.1094 +8463,2024-01-30 04:00:00-07:00,19.155 +8464,2024-01-30 04:05:00-07:00,19.2502 +8465,2024-01-30 04:10:00-07:00,19.6446 +8466,2024-01-30 04:15:00-07:00,21.1164 +8467,2024-01-30 04:20:00-07:00,21.6446 +8468,2024-01-30 04:25:00-07:00,21.5803 +8469,2024-01-30 04:30:00-07:00,20.622 +8470,2024-01-30 04:35:00-07:00,20.4523 +8471,2024-01-30 04:40:00-07:00,20.6219 +8472,2024-01-30 04:45:00-07:00,17.5768 +8473,2024-01-30 04:50:00-07:00,20.1678 +8474,2024-01-30 04:55:00-07:00,20.1341 +8475,2024-01-30 05:00:00-07:00,20.4429 +8476,2024-01-30 05:05:00-07:00,20.6065 +8477,2024-01-30 05:10:00-07:00,20.461 +8478,2024-01-30 05:15:00-07:00,20.8735 +8479,2024-01-30 05:20:00-07:00,21.3552 +8480,2024-01-30 05:25:00-07:00,21.4797 +8481,2024-01-30 05:30:00-07:00,21.7169 +8482,2024-01-30 05:35:00-07:00,22.1191 +8483,2024-01-30 05:40:00-07:00,23.1654 +8484,2024-01-30 05:45:00-07:00,23.8164 +8485,2024-01-30 05:50:00-07:00,25.6171 +8486,2024-01-30 05:55:00-07:00,29.2325 +8487,2024-01-30 06:00:00-07:00,25.5761 +8488,2024-01-30 06:05:00-07:00,26.0104 +8489,2024-01-30 06:10:00-07:00,25.5018 +8490,2024-01-30 06:15:00-07:00,24.8415 +8491,2024-01-30 06:20:00-07:00,23.755 +8492,2024-01-30 06:25:00-07:00,23.4878 +8493,2024-01-30 06:30:00-07:00,23.9564 +8494,2024-01-30 06:35:00-07:00,24.1403 +8495,2024-01-30 06:40:00-07:00,24.0439 +8496,2024-01-30 06:45:00-07:00,24.1456 +8497,2024-01-30 06:50:00-07:00,23.0671 +8498,2024-01-30 06:55:00-07:00,24.9789 +8499,2024-01-30 07:00:00-07:00,26.2859 +8500,2024-01-30 07:05:00-07:00,26.0916 +8501,2024-01-30 07:10:00-07:00,25.4105 +8502,2024-01-30 07:15:00-07:00,25.3608 +8503,2024-01-30 07:20:00-07:00,23.8833 +8504,2024-01-30 07:25:00-07:00,23.5107 +8505,2024-01-30 07:30:00-07:00,21.8745 +8506,2024-01-30 07:35:00-07:00,18.8213 +8507,2024-01-30 07:40:00-07:00,18.7753 +8508,2024-01-30 07:45:00-07:00,14.5603 +8509,2024-01-30 07:50:00-07:00,14.8101 +8510,2024-01-30 07:55:00-07:00,19.1237 +8511,2024-01-30 08:00:00-07:00,13.4146 +8512,2024-01-30 08:05:00-07:00,14.7343 +8513,2024-01-30 08:10:00-07:00,13.3341 +8514,2024-01-30 08:15:00-07:00,13.392 +8515,2024-01-30 08:20:00-07:00,13.3038 +8516,2024-01-30 08:25:00-07:00,13.2247 +8517,2024-01-30 08:30:00-07:00,13.1687 +8518,2024-01-30 08:35:00-07:00,13.2159 +8519,2024-01-30 08:40:00-07:00,13.0228 +8520,2024-01-30 08:45:00-07:00,12.9272 +8521,2024-01-30 08:50:00-07:00,12.7094 +8522,2024-01-30 08:55:00-07:00,12.5581 +8523,2024-01-30 09:00:00-07:00,12.4261 +8524,2024-01-30 09:05:00-07:00,12.5486 +8525,2024-01-30 09:10:00-07:00,12.6926 +8526,2024-01-30 09:15:00-07:00,12.9555 +8527,2024-01-30 09:20:00-07:00,17.441 +8528,2024-01-30 09:25:00-07:00,17.673 +8529,2024-01-30 09:30:00-07:00,17.6749 +8530,2024-01-30 09:35:00-07:00,17.8166 +8531,2024-01-30 09:40:00-07:00,17.3955 +8532,2024-01-30 09:45:00-07:00,18.4694 +8533,2024-01-30 09:50:00-07:00,17.3133 +8534,2024-01-30 09:55:00-07:00,14.7836 +8535,2024-01-30 10:00:00-07:00,15.2234 +8536,2024-01-30 10:05:00-07:00,16.2575 +8537,2024-01-30 10:10:00-07:00,15.6786 +8538,2024-01-30 10:15:00-07:00,16.9824 +8539,2024-01-30 10:20:00-07:00,16.1495 +8540,2024-01-30 10:25:00-07:00,16.8621 +8541,2024-01-30 10:30:00-07:00,15.7066 +8542,2024-01-30 10:35:00-07:00,15.5649 +8543,2024-01-30 10:40:00-07:00,15.2183 +8544,2024-01-30 10:45:00-07:00,15.0339 +8545,2024-01-30 10:50:00-07:00,14.7834 +8546,2024-01-30 10:55:00-07:00,14.793 +8547,2024-01-30 11:00:00-07:00,14.8821 +8548,2024-01-30 11:05:00-07:00,14.7176 +8549,2024-01-30 11:10:00-07:00,14.807 +8550,2024-01-30 11:15:00-07:00,14.8133 +8551,2024-01-30 11:20:00-07:00,14.8474 +8552,2024-01-30 11:25:00-07:00,14.8941 +8553,2024-01-30 11:30:00-07:00,14.8414 +8554,2024-01-30 11:35:00-07:00,14.9631 +8555,2024-01-30 11:40:00-07:00,14.9358 +8556,2024-01-30 11:45:00-07:00,15.032 +8557,2024-01-30 11:50:00-07:00,15.0496 +8558,2024-01-30 11:55:00-07:00,16.7701 +8559,2024-01-30 12:00:00-07:00,16.7709 +8560,2024-01-30 12:05:00-07:00,16.762 +8561,2024-01-30 12:10:00-07:00,15.9877 +8562,2024-01-30 12:15:00-07:00,13.6434 +8563,2024-01-30 12:20:00-07:00,14.3772 +8564,2024-01-30 12:25:00-07:00,14.4603 +8565,2024-01-30 12:30:00-07:00,14.6752 +8566,2024-01-30 12:35:00-07:00,14.6736 +8567,2024-01-30 12:40:00-07:00,14.2567 +8568,2024-01-30 12:45:00-07:00,14.2569 +8569,2024-01-30 12:50:00-07:00,13.3336 +8570,2024-01-30 12:55:00-07:00,13.4401 +8571,2024-01-30 13:00:00-07:00,13.8037 +8572,2024-01-30 13:05:00-07:00,14.2278 +8573,2024-01-30 13:10:00-07:00,14.2993 +8574,2024-01-30 13:15:00-07:00,14.3352 +8575,2024-01-30 13:20:00-07:00,14.3826 +8576,2024-01-30 13:25:00-07:00,14.4322 +8577,2024-01-30 13:30:00-07:00,14.431 +8578,2024-01-30 13:35:00-07:00,14.4316 +8579,2024-01-30 13:40:00-07:00,14.435 +8580,2024-01-30 13:45:00-07:00,14.4731 +8581,2024-01-30 13:50:00-07:00,15.6968 +8582,2024-01-30 13:55:00-07:00,14.7292 +8583,2024-01-30 14:00:00-07:00,14.594 +8584,2024-01-30 14:05:00-07:00,14.6329 +8585,2024-01-30 14:10:00-07:00,14.5593 +8586,2024-01-30 14:15:00-07:00,14.6408 +8587,2024-01-30 14:20:00-07:00,14.6446 +8588,2024-01-30 14:25:00-07:00,14.6429 +8589,2024-01-30 14:30:00-07:00,14.6531 +8590,2024-01-30 14:35:00-07:00,14.5046 +8591,2024-01-30 14:40:00-07:00,14.532 +8592,2024-01-30 14:45:00-07:00,14.5385 +8593,2024-01-30 14:50:00-07:00,14.5133 +8594,2024-01-30 14:55:00-07:00,14.6425 +8595,2024-01-30 15:00:00-07:00,14.6556 +8596,2024-01-30 15:05:00-07:00,14.7206 +8597,2024-01-30 15:10:00-07:00,14.7726 +8598,2024-01-30 15:15:00-07:00,14.7795 +8599,2024-01-30 15:20:00-07:00,14.9531 +8600,2024-01-30 15:25:00-07:00,15.0591 +8601,2024-01-30 15:30:00-07:00,15.0331 +8602,2024-01-30 15:35:00-07:00,15.8742 +8603,2024-01-30 15:40:00-07:00,16.9677 +8604,2024-01-30 15:45:00-07:00,17.1326 +8605,2024-01-30 15:50:00-07:00,18.8207 +8606,2024-01-30 15:55:00-07:00,17.6707 +8607,2024-01-30 16:00:00-07:00,16.9368 +8608,2024-01-30 16:05:00-07:00,18.8434 +8609,2024-01-30 16:10:00-07:00,19.1356 +8610,2024-01-30 16:15:00-07:00,20.1639 +8611,2024-01-30 16:20:00-07:00,20.7427 +8612,2024-01-30 16:25:00-07:00,21.5529 +8613,2024-01-30 16:30:00-07:00,23.3954 +8614,2024-01-30 16:35:00-07:00,25.0121 +8615,2024-01-30 16:40:00-07:00,26.5661 +8616,2024-01-30 16:45:00-07:00,27.5715 +8617,2024-01-30 16:50:00-07:00,54.3355 +8618,2024-01-30 16:55:00-07:00,67.5356 +8619,2024-01-30 17:00:00-07:00,67.6475 +8620,2024-01-30 17:05:00-07:00,67.7176 +8621,2024-01-30 17:10:00-07:00,67.7433 +8622,2024-01-30 17:15:00-07:00,58.7198 +8623,2024-01-30 17:20:00-07:00,30.8039 +8624,2024-01-30 17:25:00-07:00,33.1784 +8625,2024-01-30 17:30:00-07:00,33.1838 +8626,2024-01-30 17:35:00-07:00,33.246 +8627,2024-01-30 17:40:00-07:00,25.9625 +8628,2024-01-30 17:45:00-07:00,24.1841 +8629,2024-01-30 17:50:00-07:00,658.3607 +8630,2024-01-30 17:55:00-07:00,665.9357 +8631,2024-01-30 18:00:00-07:00,655.4275 +8632,2024-01-30 18:05:00-07:00,21.7282 +8633,2024-01-30 18:10:00-07:00,22.6584 +8634,2024-01-30 18:15:00-07:00,21.5841 +8635,2024-01-30 18:20:00-07:00,20.9835 +8636,2024-01-30 18:25:00-07:00,19.7085 +8637,2024-01-30 18:30:00-07:00,18.0294 +8638,2024-01-30 18:35:00-07:00,18.5896 +8639,2024-01-30 18:40:00-07:00,18.4745 +8640,2024-01-30 18:45:00-07:00,18.5943 +8641,2024-01-30 18:50:00-07:00,18.9411 +8642,2024-01-30 18:55:00-07:00,18.9379 +8643,2024-01-30 19:00:00-07:00,18.4617 +8644,2024-01-30 19:05:00-07:00,17.9867 +8645,2024-01-30 19:10:00-07:00,17.6172 +8646,2024-01-30 19:15:00-07:00,17.6057 +8647,2024-01-30 19:20:00-07:00,17.6598 +8648,2024-01-30 19:25:00-07:00,17.6568 +8649,2024-01-30 19:30:00-07:00,17.6015 +8650,2024-01-30 19:35:00-07:00,17.6039 +8651,2024-01-30 19:40:00-07:00,17.3865 +8652,2024-01-30 19:45:00-07:00,16.8938 +8653,2024-01-30 19:50:00-07:00,16.8733 +8654,2024-01-30 19:55:00-07:00,17.2043 +8655,2024-01-30 20:00:00-07:00,17.4915 +8656,2024-01-30 20:05:00-07:00,17.6801 +8657,2024-01-30 20:10:00-07:00,17.6303 +8658,2024-01-30 20:15:00-07:00,17.4884 +8659,2024-01-30 20:20:00-07:00,17.4381 +8660,2024-01-30 20:25:00-07:00,17.3507 +8661,2024-01-30 20:30:00-07:00,17.8959 +8662,2024-01-30 20:35:00-07:00,17.3972 +8663,2024-01-30 20:40:00-07:00,16.9927 +8664,2024-01-30 20:45:00-07:00,17.5332 +8665,2024-01-30 20:50:00-07:00,16.0988 +8666,2024-01-30 20:55:00-07:00,16.0328 +8667,2024-01-30 21:00:00-07:00,15.3546 +8668,2024-01-30 22:20:00-07:00,15.8518 +8669,2024-01-30 22:25:00-07:00,18.4681 +8670,2024-01-30 22:30:00-07:00,18.7643 +8671,2024-01-30 22:35:00-07:00,18.4814 +8672,2024-01-30 22:40:00-07:00,16.5646 +8673,2024-01-30 22:45:00-07:00,16.3359 +8674,2024-01-30 22:50:00-07:00,16.2333 +8675,2024-01-30 22:55:00-07:00,14.3852 +8676,2024-01-30 23:00:00-07:00,14.3447 +8677,2024-01-30 23:05:00-07:00,14.6827 +8678,2024-01-30 23:10:00-07:00,14.9351 +8679,2024-01-30 23:15:00-07:00,15.0531 +8680,2024-01-30 23:20:00-07:00,15.3679 +8681,2024-01-30 23:25:00-07:00,15.853 +8682,2024-01-30 23:30:00-07:00,17.1046 +8683,2024-01-30 23:35:00-07:00,17.8267 +8684,2024-01-30 23:40:00-07:00,18.026 +8685,2024-01-30 23:45:00-07:00,18.2757 +8686,2024-01-30 23:50:00-07:00,18.4469 +8687,2024-01-30 23:55:00-07:00,18.3825 +8688,2024-01-31 00:00:00-07:00,18.4086 +8689,2024-01-31 00:05:00-07:00,31.4893 +8690,2024-01-31 00:10:00-07:00,24.5264 +8691,2024-01-31 00:15:00-07:00,19.7278 +8692,2024-01-31 00:20:00-07:00,18.5915 +8693,2024-01-31 00:25:00-07:00,18.7555 +8694,2024-01-31 00:30:00-07:00,18.5951 +8695,2024-01-31 00:35:00-07:00,18.737 +8696,2024-01-31 00:40:00-07:00,18.6296 +8697,2024-01-31 00:45:00-07:00,18.5455 +8698,2024-01-31 00:50:00-07:00,18.552 +8699,2024-01-31 00:55:00-07:00,18.5429 +8700,2024-01-31 01:00:00-07:00,18.4472 +8701,2024-01-31 01:05:00-07:00,18.521 +8702,2024-01-31 01:10:00-07:00,18.5624 +8703,2024-01-31 01:15:00-07:00,18.6483 +8704,2024-01-31 01:20:00-07:00,18.6976 +8705,2024-01-31 01:25:00-07:00,18.8256 +8706,2024-01-31 01:30:00-07:00,18.7874 +8707,2024-01-31 01:35:00-07:00,19.1228 +8708,2024-01-31 01:40:00-07:00,19.6422 +8709,2024-01-31 01:45:00-07:00,20.0446 +8710,2024-01-31 01:50:00-07:00,20.1171 +8711,2024-01-31 01:55:00-07:00,20.1334 +8712,2024-01-31 02:00:00-07:00,20.3503 +8713,2024-01-31 02:05:00-07:00,20.9757 +8714,2024-01-31 02:10:00-07:00,21.6697 +8715,2024-01-31 02:15:00-07:00,28.2294 +8716,2024-01-31 02:20:00-07:00,23.1084 +8717,2024-01-31 02:25:00-07:00,21.776 +8718,2024-01-31 02:30:00-07:00,20.3858 +8719,2024-01-31 02:35:00-07:00,21.203 +8720,2024-01-31 02:40:00-07:00,20.9041 +8721,2024-01-31 02:45:00-07:00,20.2775 +8722,2024-01-31 02:50:00-07:00,20.5284 +8723,2024-01-31 02:55:00-07:00,14.7664 +8724,2024-01-31 03:00:00-07:00,14.8652 +8725,2024-01-31 03:05:00-07:00,15.2877 +8726,2024-01-31 03:10:00-07:00,15.8699 +8727,2024-01-31 03:15:00-07:00,16.6923 +8728,2024-01-31 03:20:00-07:00,15.914 +8729,2024-01-31 03:25:00-07:00,15.4142 +8730,2024-01-31 03:30:00-07:00,15.9405 +8731,2024-01-31 03:35:00-07:00,16.1172 +8732,2024-01-31 03:40:00-07:00,16.2091 +8733,2024-01-31 03:45:00-07:00,16.3632 +8734,2024-01-31 03:50:00-07:00,16.3777 +8735,2024-01-31 03:55:00-07:00,16.7432 +8736,2024-01-31 04:00:00-07:00,16.8812 +8737,2024-01-31 04:05:00-07:00,17.0686 +8738,2024-01-31 04:10:00-07:00,17.3118 +8739,2024-01-31 04:15:00-07:00,17.4685 +8740,2024-01-31 04:20:00-07:00,17.515 +8741,2024-01-31 04:25:00-07:00,17.6874 +8742,2024-01-31 04:30:00-07:00,21.1972 +8743,2024-01-31 04:35:00-07:00,18.1171 +8744,2024-01-31 04:40:00-07:00,19.2806 +8745,2024-01-31 04:45:00-07:00,18.5048 +8746,2024-01-31 04:50:00-07:00,19.3332 +8747,2024-01-31 04:55:00-07:00,18.7435 +8748,2024-01-31 05:00:00-07:00,18.417 +8749,2024-01-31 05:05:00-07:00,18.6758 +8750,2024-01-31 05:10:00-07:00,18.6068 +8751,2024-01-31 05:15:00-07:00,18.6721 +8752,2024-01-31 05:20:00-07:00,19.3804 +8753,2024-01-31 05:25:00-07:00,21.2469 +8754,2024-01-31 05:30:00-07:00,21.1419 +8755,2024-01-31 05:35:00-07:00,21.3578 +8756,2024-01-31 05:40:00-07:00,21.6517 +8757,2024-01-31 05:45:00-07:00,22.2543 +8758,2024-01-31 05:50:00-07:00,22.5738 +8759,2024-01-31 05:55:00-07:00,23.2845 +8760,2024-01-31 06:00:00-07:00,23.3034 +8761,2024-01-31 06:05:00-07:00,24.2419 +8762,2024-01-31 06:10:00-07:00,24.2835 +8763,2024-01-31 06:15:00-07:00,24.3232 +8764,2024-01-31 06:20:00-07:00,24.0597 +8765,2024-01-31 06:25:00-07:00,24.3778 +8766,2024-01-31 06:30:00-07:00,24.4328 +8767,2024-01-31 06:35:00-07:00,24.4922 +8768,2024-01-31 06:40:00-07:00,24.6396 +8769,2024-01-31 06:45:00-07:00,24.6375 +8770,2024-01-31 06:50:00-07:00,24.9947 +8771,2024-01-31 06:55:00-07:00,25.1868 +8772,2024-01-31 07:00:00-07:00,25.3564 +8773,2024-01-31 07:05:00-07:00,25.4956 +8774,2024-01-31 07:10:00-07:00,25.2594 +8775,2024-01-31 07:15:00-07:00,25.1298 +8776,2024-01-31 07:20:00-07:00,24.8274 +8777,2024-01-31 07:25:00-07:00,24.6961 +8778,2024-01-31 07:30:00-07:00,24.4779 +8779,2024-01-31 07:35:00-07:00,22.7378 +8780,2024-01-31 07:40:00-07:00,21.7212 +8781,2024-01-31 07:45:00-07:00,21.6118 +8782,2024-01-31 07:50:00-07:00,21.0692 +8783,2024-01-31 07:55:00-07:00,20.8517 +8784,2024-01-31 08:00:00-07:00,21.9657 +8785,2024-01-31 08:05:00-07:00,16.3098 +8786,2024-01-31 08:10:00-07:00,16.404 +8787,2024-01-31 08:15:00-07:00,18.7232 +8788,2024-01-31 08:20:00-07:00,16.4453 +8789,2024-01-31 08:25:00-07:00,12.3566 +8790,2024-01-31 08:30:00-07:00,12.0106 +8791,2024-01-31 08:35:00-07:00,0.1759 +8792,2024-01-31 08:40:00-07:00,14.9468 +8793,2024-01-31 08:45:00-07:00,12.074 +8794,2024-01-31 08:50:00-07:00,11.9803 +8795,2024-01-31 08:55:00-07:00,14.2652 +8796,2024-01-31 09:00:00-07:00,12.1843 +8797,2024-01-31 09:05:00-07:00,13.2169 +8798,2024-01-31 09:10:00-07:00,13.4067 +8799,2024-01-31 09:15:00-07:00,14.1117 +8800,2024-01-31 09:20:00-07:00,17.8119 +8801,2024-01-31 09:25:00-07:00,27.1339 +8802,2024-01-31 09:30:00-07:00,27.1326 +8803,2024-01-31 09:35:00-07:00,27.2186 +8804,2024-01-31 09:40:00-07:00,27.2709 +8805,2024-01-31 09:45:00-07:00,24.8565 +8806,2024-01-31 09:50:00-07:00,23.7527 +8807,2024-01-31 09:55:00-07:00,19.2157 +8808,2024-01-31 10:00:00-07:00,19.0282 +8809,2024-01-31 10:05:00-07:00,21.1388 +8810,2024-01-31 10:10:00-07:00,16.6831 +8811,2024-01-31 10:15:00-07:00,17.9983 +8812,2024-01-31 10:20:00-07:00,18.6783 +8813,2024-01-31 10:25:00-07:00,18.7759 +8814,2024-01-31 10:30:00-07:00,25.9116 +8815,2024-01-31 10:35:00-07:00,21.7961 +8816,2024-01-31 10:40:00-07:00,14.3674 +8817,2024-01-31 10:45:00-07:00,18.8117 +8818,2024-01-31 10:50:00-07:00,13.4848 +8819,2024-01-31 10:55:00-07:00,12.991 +8820,2024-01-31 11:00:00-07:00,12.9873 +8821,2024-01-31 11:05:00-07:00,14.9946 +8822,2024-01-31 11:10:00-07:00,14.2015 +8823,2024-01-31 11:15:00-07:00,18.9076 +8824,2024-01-31 11:20:00-07:00,18.6695 +8825,2024-01-31 11:25:00-07:00,19.9796 +8826,2024-01-31 11:30:00-07:00,18.7332 +8827,2024-01-31 11:35:00-07:00,17.8463 +8828,2024-01-31 11:40:00-07:00,18.6909 +8829,2024-01-31 11:45:00-07:00,18.0589 +8830,2024-01-31 11:50:00-07:00,17.4633 +8831,2024-01-31 11:55:00-07:00,18.4986 +8832,2024-01-31 12:00:00-07:00,13.8943 +8833,2024-01-31 12:05:00-07:00,16.4697 +8834,2024-01-31 12:10:00-07:00,14.1202 +8835,2024-01-31 12:15:00-07:00,20.8469 +8836,2024-01-31 12:20:00-07:00,14.1841 +8837,2024-01-31 12:25:00-07:00,13.9075 +8838,2024-01-31 12:30:00-07:00,13.3026 +8839,2024-01-31 12:35:00-07:00,13.0999 +8840,2024-01-31 12:40:00-07:00,13.4786 +8841,2024-01-31 12:45:00-07:00,13.2885 +8842,2024-01-31 12:50:00-07:00,13.9572 +8843,2024-01-31 12:55:00-07:00,14.7744 +8844,2024-01-31 13:00:00-07:00,14.1179 +8845,2024-01-31 13:05:00-07:00,13.9398 +8846,2024-01-31 13:10:00-07:00,14.1406 +8847,2024-01-31 13:15:00-07:00,13.9942 +8848,2024-01-31 13:20:00-07:00,13.8454 +8849,2024-01-31 13:25:00-07:00,13.8309 +8850,2024-01-31 13:30:00-07:00,13.545 +8851,2024-01-31 13:35:00-07:00,13.3021 +8852,2024-01-31 13:40:00-07:00,13.4756 +8853,2024-01-31 13:45:00-07:00,14.4704 +8854,2024-01-31 13:50:00-07:00,15.1588 +8855,2024-01-31 13:55:00-07:00,15.1872 +8856,2024-01-31 14:00:00-07:00,20.6029 +8857,2024-01-31 14:05:00-07:00,23.2067 +8858,2024-01-31 14:10:00-07:00,23.191 +8859,2024-01-31 14:15:00-07:00,19.047 +8860,2024-01-31 14:20:00-07:00,17.6326 +8861,2024-01-31 14:25:00-07:00,19.2724 +8862,2024-01-31 14:30:00-07:00,16.6677 +8863,2024-01-31 14:35:00-07:00,7.3213 +8864,2024-01-31 14:40:00-07:00,14.198 +8865,2024-01-31 14:45:00-07:00,485.1196 +8866,2024-01-31 14:50:00-07:00,19.1296 +8867,2024-01-31 14:55:00-07:00,21.3557 +8868,2024-01-31 15:00:00-07:00,19.9674 +8869,2024-01-31 15:05:00-07:00,20.1818 +8870,2024-01-31 15:10:00-07:00,23.2964 +8871,2024-01-31 15:15:00-07:00,21.6119 +8872,2024-01-31 15:20:00-07:00,22.8532 +8873,2024-01-31 15:25:00-07:00,22.2042 +8874,2024-01-31 15:30:00-07:00,22.0262 +8875,2024-01-31 15:35:00-07:00,22.4601 +8876,2024-01-31 15:40:00-07:00,22.8368 +8877,2024-01-31 15:45:00-07:00,22.04 +8878,2024-01-31 15:50:00-07:00,23.6032 +8879,2024-01-31 15:55:00-07:00,22.7213 +8880,2024-01-31 16:00:00-07:00,19.3466 +8881,2024-01-31 16:05:00-07:00,20.6142 +8882,2024-01-31 16:10:00-07:00,22.4048 +8883,2024-01-31 16:15:00-07:00,22.1416 +8884,2024-01-31 16:20:00-07:00,21.8121 +8885,2024-01-31 16:25:00-07:00,21.263 +8886,2024-01-31 16:30:00-07:00,21.5229 +8887,2024-01-31 16:35:00-07:00,22.5372 +8888,2024-01-31 16:40:00-07:00,23.4553 +8889,2024-01-31 16:45:00-07:00,23.4149 +8890,2024-01-31 16:50:00-07:00,24.4419 +8891,2024-01-31 16:55:00-07:00,17.8258 +8892,2024-01-31 17:00:00-07:00,17.673 +8893,2024-01-31 17:05:00-07:00,22.1565 +8894,2024-01-31 17:10:00-07:00,21.6799 +8895,2024-01-31 17:15:00-07:00,21.0814 +8896,2024-01-31 17:20:00-07:00,21.2001 +8897,2024-01-31 17:25:00-07:00,20.3271 +8898,2024-01-31 17:30:00-07:00,17.9229 +8899,2024-01-31 17:35:00-07:00,19.5942 +8900,2024-01-31 17:40:00-07:00,23.2954 +8901,2024-01-31 17:45:00-07:00,17.7225 +8902,2024-01-31 17:50:00-07:00,17.4935 +8903,2024-01-31 17:55:00-07:00,17.8203 +8904,2024-01-31 18:00:00-07:00,17.7842 +8905,2024-01-31 18:05:00-07:00,17.6346 +8906,2024-01-31 18:10:00-07:00,19.481 +8907,2024-01-31 18:15:00-07:00,17.8073 +8908,2024-01-31 18:20:00-07:00,17.604 +8909,2024-01-31 18:25:00-07:00,18.2827 +8910,2024-01-31 18:30:00-07:00,18.6308 +8911,2024-01-31 18:35:00-07:00,18.5726 +8912,2024-01-31 18:40:00-07:00,19.5843 +8913,2024-01-31 18:45:00-07:00,19.2507 +8914,2024-01-31 18:50:00-07:00,18.3669 +8915,2024-01-31 18:55:00-07:00,17.8502 +8916,2024-01-31 19:00:00-07:00,17.3303 +8917,2024-01-31 19:05:00-07:00,17.4929 +8918,2024-01-31 19:10:00-07:00,17.3414 +8919,2024-01-31 19:15:00-07:00,17.1992 +8920,2024-01-31 19:20:00-07:00,17.0682 +8921,2024-01-31 19:25:00-07:00,16.8978 +8922,2024-01-31 19:30:00-07:00,16.6508 +8923,2024-01-31 19:35:00-07:00,17.8855 +8924,2024-01-31 19:40:00-07:00,17.4863 +8925,2024-01-31 19:45:00-07:00,17.1962 +8926,2024-01-31 19:50:00-07:00,16.607 +8927,2024-01-31 19:55:00-07:00,16.1765 +8928,2024-01-31 20:00:00-07:00,16.0661 +8929,2024-01-31 20:05:00-07:00,16.6809 +8930,2024-01-31 20:10:00-07:00,16.4709 +8931,2024-01-31 20:15:00-07:00,16.7031 +8932,2024-01-31 20:20:00-07:00,16.6126 +8933,2024-01-31 20:25:00-07:00,16.1214 +8934,2024-01-31 20:30:00-07:00,15.6279 +8935,2024-01-31 20:35:00-07:00,16.2057 +8936,2024-01-31 20:40:00-07:00,15.8163 +8937,2024-01-31 20:45:00-07:00,15.4675 +8938,2024-01-31 20:50:00-07:00,14.8249 +8939,2024-01-31 20:55:00-07:00,15.3088 +8940,2024-01-31 21:00:00-07:00,15.4986 +8941,2024-01-31 21:05:00-07:00,14.9366 +8942,2024-01-31 21:10:00-07:00,16.4669 +8943,2024-01-31 21:15:00-07:00,16.7897 +8944,2024-01-31 21:20:00-07:00,17.2942 +8945,2024-01-31 21:25:00-07:00,16.9261 +8946,2024-01-31 21:30:00-07:00,16.4875 +8947,2024-01-31 21:35:00-07:00,16.0627 +8948,2024-01-31 21:40:00-07:00,15.7194 +8949,2024-01-31 21:45:00-07:00,16.4737 +8950,2024-01-31 21:50:00-07:00,15.8797 +8951,2024-01-31 21:55:00-07:00,15.7437 +8952,2024-01-31 22:00:00-07:00,18.0274 +8953,2024-01-31 22:05:00-07:00,16.8976 +8954,2024-01-31 22:10:00-07:00,19.4516 +8955,2024-01-31 22:15:00-07:00,18.7829 +8956,2024-01-31 22:20:00-07:00,18.5969 +8957,2024-01-31 22:25:00-07:00,18.5745 +8958,2024-01-31 22:30:00-07:00,18.5123 +8959,2024-01-31 22:35:00-07:00,18.4508 +8960,2024-01-31 22:40:00-07:00,16.1772 +8961,2024-01-31 22:45:00-07:00,15.1664 +8962,2024-01-31 22:50:00-07:00,10.3707 +8963,2024-01-31 22:55:00-07:00,10.3766 +8964,2024-01-31 23:00:00-07:00,20.4441 +8965,2024-01-31 23:05:00-07:00,16.7548 +8966,2024-01-31 23:10:00-07:00,14.067 +8967,2024-01-31 23:15:00-07:00,1.9304 +8968,2024-01-31 23:20:00-07:00,12.8156 +8969,2024-01-31 23:25:00-07:00,14.6573 +8970,2024-01-31 23:30:00-07:00,13.6748 +8971,2024-01-31 23:35:00-07:00,17.898 +8972,2024-01-31 23:40:00-07:00,18.1068 +8973,2024-01-31 23:45:00-07:00,12.9344 +8974,2024-01-31 23:50:00-07:00,15.3492 +8975,2024-01-31 23:55:00-07:00,1.8365 diff --git a/h2integrate/control/control_strategies/storage/test/data/lmp_peaks_month_1.csv b/h2integrate/control/control_strategies/storage/test/data/lmp_peaks_month_1.csv new file mode 100644 index 000000000..4563a3f1d --- /dev/null +++ b/h2integrate/control/control_strategies/storage/test/data/lmp_peaks_month_1.csv @@ -0,0 +1,11 @@ +,time_mountain,energy +0,2024-01-03 16:00:00-07:00,680.9031 +1,2024-01-04 08:45:00-07:00,678.7013 +2,2024-01-06 16:45:00-07:00,666.9504 +3,2024-01-07 15:55:00-07:00,694.5076 +4,2024-01-11 21:00:00-07:00,588.4286 +5,2024-01-13 21:15:00-07:00,606.7448 +6,2024-01-17 06:10:00-07:00,705.74 +7,2024-01-19 08:40:00-07:00,649.1205 +8,2024-01-21 16:50:00-07:00,655.7059 +9,2024-01-30 17:55:00-07:00,665.9357 diff --git a/h2integrate/control/control_strategies/storage/test/test_peak_load_management_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_peak_load_management_openloop_storage_controller.py new file mode 100644 index 000000000..b3c9d4bf4 --- /dev/null +++ b/h2integrate/control/control_strategies/storage/test/test_peak_load_management_openloop_storage_controller.py @@ -0,0 +1,121 @@ +from pathlib import Path + +import pandas as pd +import pytest + +from h2integrate.control.control_strategies.storage.plm_openloop_storage_controller import ( + PeakLoadManagementOpenLoopStorageController, +) + + +def _controller_without_setup(): + """Create a controller instance for testing pure helper methods.""" + return object.__new__(PeakLoadManagementOpenLoopStorageController) + + +@pytest.mark.unit +def test_get_peaks_daily_expected_peaks(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": pd.date_range("2025-01-01", periods=8, freq="6h"), + "demand": [1.0, 9.0, 3.0, 2.0, 4.0, 5.0, 2.0, 8.0], + } + + expected_peak_times = [ + pd.Timestamp("2025-01-01 06:00:00"), + pd.Timestamp("2025-01-02 18:00:00"), + ] + + peaks = controller.get_peaks(demand_profile) + actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_with_global_event_limit_expected_peak(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": pd.date_range("2025-01-01", periods=8, freq="6h"), + "demand": [1.0, 9.0, 3.0, 2.0, 4.0, 5.0, 2.0, 8.0], + } + + expected_peak_times = [pd.Timestamp("2025-01-01 06:00:00")] + + peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period=None) + actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_with_month_period_expected_peaks(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": [ + pd.Timestamp("2025-01-01 00:00:00"), + pd.Timestamp("2025-01-01 12:00:00"), + pd.Timestamp("2025-01-02 00:00:00"), + pd.Timestamp("2025-01-02 12:00:00"), + pd.Timestamp("2025-02-01 00:00:00"), + pd.Timestamp("2025-02-01 12:00:00"), + pd.Timestamp("2025-02-02 00:00:00"), + pd.Timestamp("2025-02-02 12:00:00"), + ], + "demand": [ + 5.0, + 2.0, + 9.0, + 3.0, + 4.0, + 12.0, + 8.0, + 1.0, + ], + } + + expected_peak_times = [ + pd.Timestamp("2025-01-02 00:00:00"), + pd.Timestamp("2025-02-01 12:00:00"), + ] + + peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period="M") + actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_with_month_period_from_csv_expected_peaks(): + controller = _controller_without_setup() + data_dir = Path(__file__).resolve().parent / "data" + demand_profile_df = pd.read_csv(data_dir / "lmp_month_1.csv") + expected_peaks_df = pd.read_csv(data_dir / "lmp_peaks_month_1.csv") + + demand_profile = { + "time_date": demand_profile_df["time_mountain"].to_list(), + "demand": demand_profile_df["energy"].to_list(), + } + + expected_peak_times = pd.to_datetime(expected_peaks_df["time_mountain"]).to_list() + + peaks = controller.get_peaks(demand_profile, n_max_events=10, max_events_period="M") + actual_peak_times = pd.to_datetime(peaks.loc[peaks["is_peak"], "time_date"]).tolist() + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_invalid_period_string_raises(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": pd.date_range("2025-01-01", periods=4, freq="6h"), + "demand": [1.0, 2.0, 3.0, 4.0], + } + + with pytest.raises(ValueError, match="Invalid max_events_period string"): + controller.get_peaks(demand_profile, n_max_events=1, max_events_period="not_a_period") From e8a2dfb7e87aeb61f79672306e6028112e6c24f3 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Mon, 30 Mar 2026 17:40:03 -0600 Subject: [PATCH 03/49] peak merging working --- ..._management_openloop_storage_controller.py | 121 ------------------ 1 file changed, 121 deletions(-) delete mode 100644 h2integrate/control/control_strategies/storage/test/test_peak_load_management_openloop_storage_controller.py diff --git a/h2integrate/control/control_strategies/storage/test/test_peak_load_management_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_peak_load_management_openloop_storage_controller.py deleted file mode 100644 index b3c9d4bf4..000000000 --- a/h2integrate/control/control_strategies/storage/test/test_peak_load_management_openloop_storage_controller.py +++ /dev/null @@ -1,121 +0,0 @@ -from pathlib import Path - -import pandas as pd -import pytest - -from h2integrate.control.control_strategies.storage.plm_openloop_storage_controller import ( - PeakLoadManagementOpenLoopStorageController, -) - - -def _controller_without_setup(): - """Create a controller instance for testing pure helper methods.""" - return object.__new__(PeakLoadManagementOpenLoopStorageController) - - -@pytest.mark.unit -def test_get_peaks_daily_expected_peaks(): - controller = _controller_without_setup() - - demand_profile = { - "time_date": pd.date_range("2025-01-01", periods=8, freq="6h"), - "demand": [1.0, 9.0, 3.0, 2.0, 4.0, 5.0, 2.0, 8.0], - } - - expected_peak_times = [ - pd.Timestamp("2025-01-01 06:00:00"), - pd.Timestamp("2025-01-02 18:00:00"), - ] - - peaks = controller.get_peaks(demand_profile) - actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() - - assert actual_peak_times == expected_peak_times - - -@pytest.mark.unit -def test_get_peaks_with_global_event_limit_expected_peak(): - controller = _controller_without_setup() - - demand_profile = { - "time_date": pd.date_range("2025-01-01", periods=8, freq="6h"), - "demand": [1.0, 9.0, 3.0, 2.0, 4.0, 5.0, 2.0, 8.0], - } - - expected_peak_times = [pd.Timestamp("2025-01-01 06:00:00")] - - peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period=None) - actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() - - assert actual_peak_times == expected_peak_times - - -@pytest.mark.unit -def test_get_peaks_with_month_period_expected_peaks(): - controller = _controller_without_setup() - - demand_profile = { - "time_date": [ - pd.Timestamp("2025-01-01 00:00:00"), - pd.Timestamp("2025-01-01 12:00:00"), - pd.Timestamp("2025-01-02 00:00:00"), - pd.Timestamp("2025-01-02 12:00:00"), - pd.Timestamp("2025-02-01 00:00:00"), - pd.Timestamp("2025-02-01 12:00:00"), - pd.Timestamp("2025-02-02 00:00:00"), - pd.Timestamp("2025-02-02 12:00:00"), - ], - "demand": [ - 5.0, - 2.0, - 9.0, - 3.0, - 4.0, - 12.0, - 8.0, - 1.0, - ], - } - - expected_peak_times = [ - pd.Timestamp("2025-01-02 00:00:00"), - pd.Timestamp("2025-02-01 12:00:00"), - ] - - peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period="M") - actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() - - assert actual_peak_times == expected_peak_times - - -@pytest.mark.unit -def test_get_peaks_with_month_period_from_csv_expected_peaks(): - controller = _controller_without_setup() - data_dir = Path(__file__).resolve().parent / "data" - demand_profile_df = pd.read_csv(data_dir / "lmp_month_1.csv") - expected_peaks_df = pd.read_csv(data_dir / "lmp_peaks_month_1.csv") - - demand_profile = { - "time_date": demand_profile_df["time_mountain"].to_list(), - "demand": demand_profile_df["energy"].to_list(), - } - - expected_peak_times = pd.to_datetime(expected_peaks_df["time_mountain"]).to_list() - - peaks = controller.get_peaks(demand_profile, n_max_events=10, max_events_period="M") - actual_peak_times = pd.to_datetime(peaks.loc[peaks["is_peak"], "time_date"]).tolist() - - assert actual_peak_times == expected_peak_times - - -@pytest.mark.unit -def test_get_peaks_invalid_period_string_raises(): - controller = _controller_without_setup() - - demand_profile = { - "time_date": pd.date_range("2025-01-01", periods=4, freq="6h"), - "demand": [1.0, 2.0, 3.0, 4.0], - } - - with pytest.raises(ValueError, match="Invalid max_events_period string"): - controller.get_peaks(demand_profile, n_max_events=1, max_events_period="not_a_period") From 7276db6989702ea9829f06942f6f70f6c85fd347 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Tue, 31 Mar 2026 13:26:47 -0600 Subject: [PATCH 04/49] all elements present --- .../plm_openloop_storage_controller.py | 534 ++++++++++++++++++ .../test_plm_openloop_storage_controller.py | 393 +++++++++++++ 2 files changed, 927 insertions(+) create mode 100644 h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py create mode 100644 h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py new file mode 100644 index 000000000..a34603b95 --- /dev/null +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -0,0 +1,534 @@ +from copy import deepcopy +from datetime import time + +import numpy as np +import pandas as pd +from attrs import field, define + +from h2integrate.core.utilities import merge_shared_inputs +from h2integrate.core.validators import contains, gte_zero, range_val, range_val_or_none +from h2integrate.control.control_strategies.storage.openloop_storage_control_base import ( + StorageOpenLoopControlBase, + StorageOpenLoopControlBaseConfig, +) + + +@define(kw_only=True) +class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBaseConfig): + """ + Configuration class for the DemandOpenLoopStorageController. + + This class defines the parameters required to configure the `DemandOpenLoopStorageController`. + + Attributes: + commodity (str): Name of the commodity being controlled + (e.g., "hydrogen"). Stripped of whitespace. + commodity_rate_units (str): Units of the commodity (e.g., "kg/h"). + demand_profile (int | float | list): Demand values for each timestep, in + the same units as `commodity_rate_units`. May be a scalar for constant + demand or a list/array for time-varying demand. + max_capacity (float): Maximum storage capacity of the commodity (in non-rate units, + e.g., "kg" if `commodity_rate_units` is "kg/h"). + max_soc_fraction (float): Maximum allowable state of charge (SOC) as a fraction + of `max_capacity`, between 0 and 1. + min_soc_fraction (float): Minimum allowable SOC as a fraction of `max_capacity`, + between 0 and 1. + init_soc_fraction (float): Initial SOC as a fraction of `max_capacity`, + between 0 and 1. + max_charge_rate (float): Maximum rate at which the commodity can be charged (in units + per time step, e.g., "kg/time step"). This rate does not include the charge_efficiency. + charge_equals_discharge (bool, optional): If True, set the max_discharge_rate equal to the + max_charge_rate. If False, specify the max_discharge_rate as a value different than + the max_charge_rate. Defaults to True. + max_discharge_rate (float | None, optional): Maximum rate at which the commodity can be + discharged (in units per time step, e.g., "kg/time step"). This rate does not include + the discharge_efficiency. Only required if `charge_equals_discharge` is False. + charge_efficiency (float | None, optional): Efficiency of charging the storage, represented + as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if + `round_trip_efficiency` is provided. + discharge_efficiency (float | None, optional): Efficiency of discharging the storage, + represented as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if + `round_trip_efficiency` is provided. + round_trip_efficiency (float | None, optional): Combined efficiency of charging and + discharging the storage, represented as a decimal between 0 and 1 (e.g., 0.81 for + 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are + provided. + commodity_amount_units (str | None, optional): Units of the commodity as an amount + (i.e., kW*h or kg). If not provided, defaults to commodity_rate_units*h. + demand_profile_supervisor (dict | None, optional): Demand values for additional + connected system for each timestep, in the same units as `commodity_rate_units`. + May be a scalar for constant demand or a list/array for time-varying demand. + dispatch_priority_demand_profile (str | None, optional): which demand profile takes + precedence for dispatch decisions. + max_supervisor_event_period: (int | None, optional): Duration, in time steps, of the period + in which the max_supervisor_events must occur. Defaults to the length of the simulation, + or in other words self.n_timesteps + max_supervisor_events: (int | None, optional): The maximum number of discharge events + allowed for the supervisor in the period specified in max_supervisor_event_period, + or across all time steps if max_supervisor_event_period is None. + + """ + + max_capacity: float = field() + max_soc_fraction: float = field(validator=range_val(0, 1)) + min_soc_fraction: float = field(validator=range_val(0, 1)) + init_soc_fraction: float = field(validator=range_val(0, 1)) + max_charge_rate: float = field(validator=gte_zero) + charge_equals_discharge: bool = field(default=True) + max_discharge_rate: float | None = field(default=None) + charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + demand_profile: dict = field() + demand_profile_supervisor: dict | None = field(default=None) + dispatch_priority_demand_profile: str = field( + default="demand_profile_supervisor", + validator=contains(["demand_profile", "demand_profile_supervisor"]), + ) + max_supervisor_events: int | None = (field(default=None),) + supervisor_event_period: int | str | None = field(default=None) + peak_range: dict = field(default={"start": time.min, "end": time.max}) + advance_discharge_period: dict = field(default={"units": "H", "val": 2}) + delay_charge_period: dict = field(default={"units": "H", "val": 4}) + allow_charge_in_peak_range: bool = field(default=True) + + def __attrs_post_init__(self): + """ + Post-initialization logic to validate and calculate efficiencies. + + Ensures that either `charge_efficiency` and `discharge_efficiency` are provided, + or `round_trip_efficiency` is provided. If `round_trip_efficiency` is provided, + it calculates `charge_efficiency` and `discharge_efficiency` as the square root + of `round_trip_efficiency`. + """ + super().__attrs_post_init__() + + if (self.round_trip_efficiency is not None) and ( + self.charge_efficiency is None and self.discharge_efficiency is None + ): + # Calculate charge and discharge efficiencies from round-trip efficiency + self.charge_efficiency = np.sqrt(self.round_trip_efficiency) + self.discharge_efficiency = np.sqrt(self.round_trip_efficiency) + self.round_trip_efficiency = None + if self.charge_efficiency is None or self.discharge_efficiency is None: + raise ValueError( + "Exactly one of the following sets of parameters must be set: (a) " + "`round_trip_efficiency`, or (b) both `charge_efficiency` " + "and `discharge_efficiency`." + ) + + if self.charge_equals_discharge: + if ( + self.max_discharge_rate is not None + and self.max_discharge_rate != self.max_charge_rate + ): + msg = ( + "Max discharge rate does not equal max charge rate but charge_equals_discharge " + f"is True. Discharge rate is {self.max_discharge_rate} and charge rate " + f"is {self.max_charge_rate}." + ) + raise ValueError(msg) + + self.max_discharge_rate = self.max_charge_rate + + +class PeakLoadManagementOpenLoopStorageController(StorageOpenLoopControlBase): + """ + A controller that manages commodity flow based on demand and storage constraints. + + The `DemandOpenLoopStorageController` computes the dispatch commands for a commodity storage + system. It uses a demand profile and storage parameters to determine how much of the + commodity to charge, discharge, or curtail at each time step. + """ + + def setup(self): + self.config = PeakLoadManagementOpenLoopStorageController.from_dict( + merge_shared_inputs(self.options["tech_config"]["model_inputs"], "control"), + strict=False, + additional_cls_name=self.__class__.__name__, + ) + super().setup() + + self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] + + # Design constraints of storage system + self.add_input( + "max_charge_rate", + val=self.config.max_charge_rate, + units=self.config.commodity_rate_units, + desc="Storage charge/discharge rate", + ) + + self.add_input( + "storage_capacity", + val=self.config.max_capacity, + units=self.config.commodity_amount_units, + desc="Maximum storage capacity", + ) + + if not self.config.charge_equals_discharge: + self.add_input( + "max_discharge_rate", + val=self.config.max_discharge_rate, + units=self.config.commodity_rate_units, + desc="Storage discharge rate", + ) + + # n_timesteps is number of timesteps in a simulation + self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] + + # dt is seconds per timestep + self.dt = self.options["plant_config"]["plant"]["simulation"]["dt"] + + # determine demand_profile_supervisor peaks + if self.config.demand_profile_supervisor is not None: + self.supervisor_peaks_df = self.get_peaks( + demand_profile=self.config.demand_profile_supervisor, + n_max_events=self.config.max_supervisor_events, + max_events_period=self.config.max_supervisor_event_period, + min_proximity={"units": "H", "val": 4}, + ) + else: + self.supervisor_peaks_df = None + + # determine demand_profile peaks using defaults of daily peaks inside peak_range + # for the full simulation but respecting the peak range specified in the config + self.secondary_peaks_df = self.get_peaks( + demand_profile=self.condig.demand_profile, + peak_range=self.config.peak_range, + ) + + if self.config.dispatch_priority_demand_profile == "demand_profile_supervisor": + self.peaks_df = self.merge_peaks(self.supervisor_peaks_df, self.secondary_peaks_df) + else: + self.peaks_df = self.merge_peaks(self.secondary_peaks_df, self.supervisor_peaks_df) + + self.get_time_to_peak() + + self.get_allowed_discharge() + + def compute(self, inputs, outputs): + """ + Compute storage state of charge (SOC), delivered output, curtailment, and unmet + demand over the simulation horizon. + + This method applies an open-loop storage control strategy to balance the + commodity demand and input flow. When input exceeds demand, excess commodity + is used to charge storage (subject to rate, efficiency, and SOC limits). When + demand exceeds input, storage is discharged to meet the deficit (also subject + to constraints). SOC is updated at each time step, ensuring it remains within + allowable bounds. + + Expected input keys: + * ``_in``: Timeseries of commodity available at each time step. + * ``_demand``: Timeseries demand profile. + * ``max_charge_rate``: Maximum charge rate permitted. + * ``max_capacity``: Maximum total storage capacity. + + Outputs populated: + * ``_set_point``: Dispatch command to storage, + negative when charging, positive when discharging. + + Control logic includes: + * Enforcing SOC limits (min, max, and initial conditions). + * Applying charge and discharge efficiencies. + * Observing charge/discharge rate limits. + * Tracking energy shortfalls and excesses at each time step. + + Raises: + UserWarning: If the demand profile is entirely zero. + UserWarning: If ``max_charge_rate`` or ``max_capacity`` is negative. + + Returns: + None + """ + + # we need to discharge starting at advance_discharge_period before each peak + # we also need to only discharge the peak_range + # we also need to discharge until the SOC is at the min_soc + # discharge at the max discharge rate always except to reach min charge + + # we need to charge soon after the battery reaches the min_charge, but not too soon + # we cannot charge during the peak range if allow_charge_during_peak is False + # charge at the max charge rate always except to reach max charge + + commodity = self.config.commodity + if np.all(inputs[f"{commodity}_demand"] == 0.0): + msg = "Demand profile is zero, check that demand profile is input" + raise UserWarning(msg) + if inputs["max_charge_rate"][0] < 0: + msg = ( + f"max_charge_rate cannot be less than zero and has value of " + f"{inputs['max_charge_rate']}" + ) + raise UserWarning(msg) + if inputs["storage_capacity"][0] < 0: + msg = ( + f"storage_capacity cannot be less than zero and has value of " + f"{inputs['storage_capacity']}" + ) + raise UserWarning(msg) + + max_capacity = inputs["storage_capacity"].item() + max_charge_rate = inputs["max_charge_rate"].item() + + if self.config.charge_equals_discharge: + max_discharge_rate = inputs["max_charge_rate"].item() + else: + max_discharge_rate = inputs["max_discharge_rate"].item() + + soc_max = self.config.max_soc_fraction + soc_min = self.config.min_soc_fraction + init_soc_fraction = self.config.init_soc_fraction + + charge_eff = float(self.config.charge_efficiency) + discharge_eff = float(self.config.discharge_efficiency) + + # Initialize time-step state of charge prior to loop so the loop starts with + # the previous time step's value + soc = deepcopy(init_soc_fraction) + + # demand_profile = inputs[f"{commodity}_demand"] + + # initialize outputs + soc_array = np.zeros(self.n_timesteps) + set_point_array = np.zeros(self.n_timesteps) + + # we need a bool to track if we are discharging or charging or neither + discharging = False + charging = False + advance_discharge_period = pd.Timedelta(self.config.advance_discharge_period) + delay_charge_period = pd.Timedelta(self.config.delay_charge_period) + + last_discharge = self.peaks_df["time_date"].iloc[0] - delay_charge_period + + # Loop through each time step + for i, demand_t in enumerate(self.peaks_df["demand"].tolist()): + td = self.peaks_df["time_date"] + time_to_peak = self.peaks_df["time_to_peak"].iloc[i] + + # Get the input flow at the current time step + input_flow = inputs[f"{commodity}_in"][i] + + # Calculate the available charge/discharge capacity + available_charge = float((soc_max - soc) * max_capacity) + available_discharge = float((soc - soc_min) * max_capacity) + + # start discharging when we approach a peak and have some charge + if time_to_peak <= advance_discharge_period and soc > soc_min: + discharging = True + + if not discharging and soc < soc_max: + if self.peaks_df["allow_discharge"].iloc[i]: + if (td - last_discharge) > delay_charge_period: + charging = True + + if discharging: + # Discharge storage to meet demand. + # `discharge_needed` is as seen by the storage + discharge_needed = max_discharge_rate / discharge_eff + # `discharge` is as seen by the storage, but `max_discharge_rate` is as observed + # outside the storage + discharge = min( + discharge_needed, available_discharge, max_discharge_rate / discharge_eff + ) + + soc -= discharge / max_capacity # soc is a ratio with value between 0 and 1 + # output is as observed outside the storage, so we need to adjust `discharge` by + # applying `discharge_efficiency`. + set_point_array[i] = discharge * discharge_eff + + # get time discharge completion + if soc <= soc_min: + last_discharge = td + + elif charging: + # Charge storage with unused input + # `unused_input` is as seen outside the storage + unused_input = input_flow - demand_t + unused_input = unused_input.item() + # `charge` is as seen by the storage, but the things being compared should all be as + # seen outside the storage so we need to adjust `available_charge` outside the + # storage view and the final result back into the storage view. + charge = min(available_charge / charge_eff, max_charge_rate) * charge_eff + soc += charge / max_capacity # soc is a ratio with value between 0 and 1 + set_point_array[i] = -1 * charge / charge_eff + + # Ensure SOC stays within bounds + soc = max(soc_min, min(soc_max, soc)) + + # Record the SOC for the current time step + soc_array[i] = deepcopy(soc) + + # stay in discharge mode until the battery is fully discharged + if soc <= soc_min: + discharging = False + if soc >= soc_max: + charging = False + + outputs[f"{commodity}_set_point"] = set_point_array + + def get_peaks( + self, + demand_profile: dict, + n_max_events=None, + max_events_period=None, + min_proximity=None, + peak_range={"start": time.min, "end": time.max}, + ): + """Determines the peaks of the demand profile + + Args: + demand_profile (dict): with keys "time_date" and "demand" + max_events (_type_, optional): _description_. Defaults to None. + max_events_period (_type_, optional): _description_. Defaults to None. + min_proximity (dict | None, optional): Minimum spacing between peaks, + provided as {"units": , "val": }. + peak_range (dict, optional): Daily time window used to determine + candidate peaks, with keys {"start", "end"} as `datetime.time`. + Defaults to include the full day. Start must come before end and both + must be in the same day. + """ + + # create dataframe from dictionary + demand_df = pd.DataFrame(demand_profile) + if "time_date" not in demand_df or "demand" not in demand_df: + raise ValueError("demand_profile must include 'time_date' and 'demand' keys") + + demand_df["time_date"] = pd.to_datetime(demand_df["time_date"]) + demand_df["period_day"] = demand_df["time_date"].dt.floor("D") + + if not isinstance(peak_range["start"], time) or not isinstance(peak_range["end"], time): + raise ValueError("peak_range['start'] and peak_range['end'] must be datetime.time") + time_of_day = demand_df["time_date"].dt.time + if peak_range["start"] <= peak_range["end"]: + in_peak_range = (time_of_day >= peak_range["start"]) & ( + time_of_day <= peak_range["end"] + ) + else: + raise (ValueError("Peak range start must come before peak range end in the same day")) + + # flag daily peaks up to n_max_events per max_events_period unless None, then flag all + # daily peaks. When using max events, the highest n_max_events in the max_events_period + # should be used. + demand_df["is_peak"] = False + daily_peak_idx = demand_df.loc[in_peak_range].groupby("period_day")["demand"].idxmax() + demand_df.loc[daily_peak_idx, "is_peak"] = True + + if n_max_events is not None: + if n_max_events < 0: + raise ValueError("n_max_events must be >= 0") + + peak_candidates = demand_df.loc[demand_df["is_peak"]].copy() + keep_idx = [] + + if max_events_period is None: + keep_idx = peak_candidates.nlargest(n_max_events, "demand").index.tolist() + else: + if isinstance(max_events_period, int): + if max_events_period <= 0: + raise ValueError( + "max_events_period must be positive when provided as an int" + ) + + demand_df["period_id"] = np.arange(len(demand_df)) // max_events_period + peak_candidates["period_id"] = demand_df.loc[peak_candidates.index, "period_id"] + + elif isinstance(max_events_period, str): + period_freq = max_events_period.strip() + try: + demand_df["period_id"] = demand_df["time_date"].dt.to_period(period_freq) + except ValueError as exc: + raise ValueError( + "Invalid max_events_period string. Use a pandas period frequency " + "(for example 'Y', 'Q', 'M', 'W', 'D', 'H')." + ) from exc + + peak_candidates["period_id"] = demand_df.loc[peak_candidates.index, "period_id"] + else: + raise ValueError( + "max_events_period must be None, a positive integer, or a pandas period " + "frequency string" + ) + + for _, period_group in peak_candidates.groupby("period_id"): + keep_idx.extend(period_group.nlargest(n_max_events, "demand").index.tolist()) + + demand_df = demand_df.drop(columns=["period_id"]) + + demand_df["is_peak"] = False + demand_df.loc[keep_idx, "is_peak"] = True + + if min_proximity is not None: + if not isinstance(min_proximity, dict): + raise ValueError("min_proximity must be a dict with keys 'units' and 'val'") + if "units" not in min_proximity or "val" not in min_proximity: + raise ValueError("min_proximity must include keys 'units' and 'val'") + + units = min_proximity["units"] + val = min_proximity["val"] + if not isinstance(units, str) or not units.strip(): + raise ValueError("min_proximity['units'] must be a non-empty string") + if not isinstance(val, int | float) or val < 0: + raise ValueError("min_proximity['val'] must be a non-negative number") + + min_delta = pd.to_timedelta(val, unit=units.strip()) + if min_delta > pd.Timedelta(0): + selected_peaks = demand_df.loc[demand_df["is_peak"], ["time_date", "demand"]] + selected_peaks = selected_peaks.sort_values("time_date") + + if len(selected_peaks) > 1: + deltas = selected_peaks["time_date"].diff().dropna() + if (deltas < min_delta).any(): + raise ValueError( + "Selected peaks violate min_proximity. " + "Increase spacing between events or relax min_proximity." + ) + + return demand_df.drop(columns=["period_day"]) + + def merge_peaks(supervisory_peaks_df, secondary_peaks_df): + # take exactly one peak per day with supervisor_peaks taking precedence if present + # the result should be a dictionary with time_date and "is_peak" bool + peaks_df = secondary_peaks_df.copy() + if supervisory_peaks_df is not None: + for day in secondary_peaks_df["time_date"].dt.floor("D").unique(): + day_df = supervisory_peaks_df[ + supervisory_peaks_df["time_date"].dt.floor("D") == day + ] + if any(day_df["is_peak"]): + peaks_df["is_peak"][peaks_df["time_date"].dt.floor("D") == day] = day_df[ + "is_peak" + ] + + return peaks_df + + def get_time_to_peak(self): + self.peaks_df["time_to_peak"] = ( + time.max + ) # TODO This may not be the best default. It will cause no charging at the end of the time series + for _i, idx in enumerate(self.peaks_df.index): + next_peak_time = self.peaks_df.loc[ + self.peaks_df["is_peak"] & (self.peaks_df.index >= idx), "time_date" + ] + if len(next_peak_time) > 0: + next_peak_time = next_peak_time.iloc[0] + self.peaks_df.loc[idx, "time_to_peak"] = ( + next_peak_time - self.peaks_df.loc[idx, "time_date"] + ) + else: + continue + + def get_allowed_discharge(self): + # we will also need to know if a point is in an allowed charging time + if self.config.allow_charge_in_peak_range: + self.peaks_df["allow_charge"] = True + else: + # only allow_charge when time step is not in peak range + self.peaks_df["allow_charge"] = False + for i in range(self.n_timesteps): + if ( + self.peaks_df["time_date"].iloc[i].time() < self.config.peak_range["start"] + or self.peaks_df["time_date"].iloc[i].time() >= self.config.peak_range["end"] + ): + self.peaks_df["allow_charge"].iloc[i] = True diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py new file mode 100644 index 000000000..2750afd0c --- /dev/null +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -0,0 +1,393 @@ +from types import SimpleNamespace +from pathlib import Path +from datetime import time + +import numpy as np +import pandas as pd +import pytest + +from h2integrate.control.control_strategies.storage.plm_openloop_storage_controller import ( + PeakLoadManagementOpenLoopStorageController, +) + + +def _controller_without_setup(): + """Create a controller instance for testing pure helper methods.""" + return object.__new__(PeakLoadManagementOpenLoopStorageController) + + +@pytest.mark.unit +def test_get_peaks_daily_expected_peaks(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": pd.date_range("2025-01-01", periods=8, freq="6h"), + "demand": [1.0, 9.0, 3.0, 2.0, 4.0, 5.0, 2.0, 8.0], + } + + expected_peak_times = [ + pd.Timestamp("2025-01-01 06:00:00"), + pd.Timestamp("2025-01-02 18:00:00"), + ] + + peaks = controller.get_peaks(demand_profile) + actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_with_global_event_limit_expected_peak(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": pd.date_range("2025-01-01", periods=8, freq="6h"), + "demand": [1.0, 9.0, 3.0, 2.0, 4.0, 5.0, 2.0, 8.0], + } + + expected_peak_times = [pd.Timestamp("2025-01-01 06:00:00")] + + peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period=None) + actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_with_month_period_expected_peaks(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": [ + pd.Timestamp("2025-01-01 00:00:00"), + pd.Timestamp("2025-01-01 12:00:00"), + pd.Timestamp("2025-01-02 00:00:00"), + pd.Timestamp("2025-01-02 12:00:00"), + pd.Timestamp("2025-02-01 00:00:00"), + pd.Timestamp("2025-02-01 12:00:00"), + pd.Timestamp("2025-02-02 00:00:00"), + pd.Timestamp("2025-02-02 12:00:00"), + ], + "demand": [ + 5.0, + 2.0, + 9.0, + 3.0, + 4.0, + 12.0, + 8.0, + 1.0, + ], + } + + expected_peak_times = [ + pd.Timestamp("2025-01-02 00:00:00"), + pd.Timestamp("2025-02-01 12:00:00"), + ] + + peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period="M") + actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_with_month_period_from_csv_expected_peaks(): + controller = _controller_without_setup() + data_dir = Path(__file__).resolve().parent / "data" + demand_profile_df = pd.read_csv(data_dir / "lmp_month_1.csv") + expected_peaks_df = pd.read_csv(data_dir / "lmp_peaks_month_1.csv") + + demand_profile = { + "time_date": demand_profile_df["time_mountain"].to_list(), + "demand": demand_profile_df["energy"].to_list(), + } + + expected_peak_times = pd.to_datetime(expected_peaks_df["time_mountain"]).to_list() + + peaks = controller.get_peaks(demand_profile, n_max_events=10, max_events_period="M") + actual_peak_times = pd.to_datetime(peaks.loc[peaks["is_peak"], "time_date"]).tolist() + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_invalid_period_string_raises(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": pd.date_range("2025-01-01", periods=4, freq="6h"), + "demand": [1.0, 2.0, 3.0, 4.0], + } + + with pytest.raises(ValueError, match="Invalid max_events_period string"): + controller.get_peaks(demand_profile, n_max_events=1, max_events_period="not_a_period") + + +@pytest.mark.unit +def test_get_peaks_respects_peak_range_12pm_to_5pm(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": [ + pd.Timestamp("2025-01-01 09:00:00"), + pd.Timestamp("2025-01-01 14:00:00"), + pd.Timestamp("2025-01-01 18:00:00"), + pd.Timestamp("2025-01-01 22:00:00"), + pd.Timestamp("2025-01-02 10:00:00"), + pd.Timestamp("2025-01-02 13:00:00"), + pd.Timestamp("2025-01-02 20:00:00"), + pd.Timestamp("2025-01-02 23:00:00"), + ], + "demand": [ + 100.0, + 30.0, + 40.0, + 120.0, + 95.0, + 50.0, + 60.0, + 110.0, + ], + } + + peaks = controller.get_peaks( + demand_profile, + peak_range={"start": time(12, 0), "end": time(17, 0)}, + ) + actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + + expected_peak_times = [ + pd.Timestamp("2025-01-01 14:00:00"), + pd.Timestamp("2025-01-02 13:00:00"), + ] + + assert actual_peak_times == expected_peak_times + + +@pytest.mark.unit +def test_get_peaks_invalid_min_proximity_raises(): + controller = _controller_without_setup() + + demand_profile = { + "time_date": pd.date_range("2025-01-01", periods=10, freq="6h"), + "demand": [1.0, 2.0, 4.0, 3.0, 3.0, 4.0, 3.0, 2.0, 1.0, 2.0], + } + + with pytest.raises(ValueError, match="Selected peaks violate min_proximity."): + controller.get_peaks( + demand_profile, + n_max_events=2, + max_events_period="W", + min_proximity={"units": "D", "val": 1}, + ) + + +@pytest.mark.unit +def test_merge_peaks_without_supervisor_returns_secondary_flags(subtests): + secondary_peaks_df = pd.DataFrame( + { + "time_date": pd.to_datetime( + [ + "2025-01-01 14:00:00", + "2025-01-01 18:00:00", + "2025-01-02 13:00:00", + "2025-01-02 20:00:00", + ] + ), + "is_peak": [False, True, False, True], + "demand": [1.0, 5.0, 1.0, 6.0], + } + ) + + merged = PeakLoadManagementOpenLoopStorageController.merge_peaks(None, secondary_peaks_df) + + with subtests.test("peak flags unchanged"): + assert merged["is_peak"].tolist() == secondary_peaks_df["is_peak"].tolist() + + +@pytest.mark.unit +def test_merge_peaks_supervisor_takes_precedence_on_same_day(subtests): + secondary_peaks_df = pd.DataFrame( + { + "time_date": pd.to_datetime( + [ + "2025-01-01 14:00:00", + "2025-01-01 18:00:00", + "2025-01-02 13:00:00", + "2025-01-02 20:00:00", + ] + ), + "is_peak": [False, True, False, True], + "demand": [1.0, 5.0, 1.0, 6.0], + } + ) + supervisory_peaks_df = pd.DataFrame( + { + "time_date": pd.to_datetime( + [ + "2025-01-01 14:00:00", + "2025-01-01 18:00:00", + "2025-01-02 13:00:00", + "2025-01-02 20:00:00", + ] + ), + "is_peak": [True, False, False, False], + "demand": [9.0, 4.0, 6.0, 4.0], + } + ) + + merged = PeakLoadManagementOpenLoopStorageController.merge_peaks( + supervisory_peaks_df, + secondary_peaks_df, + ) + + with subtests.test("day1 follows supervisor flags"): + np.testing.assert_array_equal( + merged["is_peak"].iloc[0:2], supervisory_peaks_df["is_peak"].iloc[0:2] + ) + + with subtests.test("day2 follows secondary flags"): + np.testing.assert_array_equal( + merged["is_peak"].iloc[2:4], + secondary_peaks_df["is_peak"].iloc[2:4], + ) + + +@pytest.mark.unit +def test_get_time_to_peak_single_peak(subtests): + """Time-to-peak counted down from each row toward the one True is_peak entry.""" + controller = _controller_without_setup() + controller.n_timesteps = 4 + times = pd.to_datetime( + [ + "2025-01-01 12:00:00", + "2025-01-01 14:00:00", + "2025-01-01 16:00:00", # peak + "2025-01-01 18:00:00", + ] + ) + controller.peaks_df = pd.DataFrame( + { + "time_date": times, + "is_peak": [False, False, True, False], + "demand": [1.0, 2.0, 5.0, 3.0], + } + ) + + controller.get_time_to_peak() + + with subtests.test("four hours before peak"): + assert controller.peaks_df["time_to_peak"].iloc[0] == pd.Timedelta(hours=4) + with subtests.test("two hours before peak"): + assert controller.peaks_df["time_to_peak"].iloc[1] == pd.Timedelta(hours=2) + with subtests.test("zero at peak"): + assert controller.peaks_df["time_to_peak"].iloc[2] == pd.Timedelta(0) + + +@pytest.mark.unit +def test_get_time_to_peak_multiple_peaks(subtests): + """Each row resolves to the *next upcoming* peak, not a later one.""" + controller = _controller_without_setup() + controller.n_timesteps = 5 + times = pd.to_datetime( + [ + "2025-01-01 08:00:00", + "2025-01-01 10:00:00", # first peak + "2025-01-01 12:00:00", + "2025-01-01 16:00:00", # second peak + "2025-01-01 18:00:00", + ] + ) + controller.peaks_df = pd.DataFrame( + { + "time_date": times, + "is_peak": [False, True, False, True, False], + "demand": [1.0, 8.0, 2.0, 7.0, 1.0], + } + ) + + controller.get_time_to_peak() + + with subtests.test("before first peak resolves to first peak"): + assert controller.peaks_df["time_to_peak"].iloc[0] == pd.Timedelta(hours=2) + + with subtests.test("at first peak is zero"): + assert controller.peaks_df["time_to_peak"].iloc[1] == pd.Timedelta(0) + + with subtests.test("between peaks resolves to second peak"): + assert controller.peaks_df["time_to_peak"].iloc[2] == pd.Timedelta(hours=4) + + with subtests.test("at second peak is zero"): + assert controller.peaks_df["time_to_peak"].iloc[3] == pd.Timedelta(0) + + +def _make_controller_with_config(allow_charge_in_peak_range, peak_range): + controller = _controller_without_setup() + controller.config = SimpleNamespace( + allow_charge_in_peak_range=allow_charge_in_peak_range, + peak_range=peak_range, + ) + return controller + + +@pytest.mark.unit +def test_get_allowed_discharge_always_true_when_charge_allowed_in_peak_range(): + """When allow_charge_in_peak_range=True every row should allow charging.""" + controller = _make_controller_with_config( + allow_charge_in_peak_range=True, + peak_range={"start": time(12, 0), "end": time(17, 0)}, + ) + controller.peaks_df = pd.DataFrame( + { + "time_date": pd.to_datetime( + [ + "2025-01-01 09:00:00", + "2025-01-01 14:00:00", # inside peak range + "2025-01-01 18:00:00", + ] + ), + "is_peak": [False, True, False], + "demand": [1.0, 5.0, 2.0], + } + ) + controller.n_timesteps = 3 + + controller.get_allowed_discharge() + + assert controller.peaks_df["allow_charge"].tolist() == [True, True, True] + + +@pytest.mark.unit +def test_get_allowed_discharge_blocks_charge_inside_peak_range(subtests): + """When allow_charge_in_peak_range=False, rows inside the window get allow_charge=False.""" + controller = _make_controller_with_config( + allow_charge_in_peak_range=False, + peak_range={"start": time(12, 0), "end": time(17, 0)}, + ) + controller.peaks_df = pd.DataFrame( + { + "time_date": pd.to_datetime( + [ + "2025-01-01 09:00:00", # before range → allow + "2025-01-01 14:00:00", # inside range → block + "2025-01-01 16:59:00", # inside range → block + "2025-01-01 18:00:00", # after range → allow + ] + ), + "is_peak": [False, True, False, False], + "demand": [1.0, 5.0, 4.0, 2.0], + } + ) + controller.n_timesteps = 4 + + controller.get_allowed_discharge() + + with subtests.test("before range allows charge"): + assert controller.peaks_df["allow_charge"].iloc[0] is np.True_ + with subtests.test("inside range blocks charge (first)"): + assert controller.peaks_df["allow_charge"].iloc[1] is np.False_ + with subtests.test("inside range blocks charge (second)"): + assert controller.peaks_df["allow_charge"].iloc[2] is np.False_ + with subtests.test("after range allows charge"): + assert controller.peaks_df["allow_charge"].iloc[3] is np.True_ From 6fc22a721ba803dd71af237db11a8c74e17febd1 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Tue, 31 Mar 2026 14:10:56 -0600 Subject: [PATCH 05/49] update comments and doc strings --- .../plm_openloop_storage_controller.py | 261 +++++++++++++----- 1 file changed, 187 insertions(+), 74 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index a34603b95..5f13d06a2 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -16,9 +16,10 @@ @define(kw_only=True) class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBaseConfig): """ - Configuration class for the DemandOpenLoopStorageController. + Configuration class for the PeakLoadManagementOpenLoopStorageController. - This class defines the parameters required to configure the `DemandOpenLoopStorageController`. + Defines all parameters required to configure the peak-load management storage controller, + including storage constraints, efficiency parameters, peak detection, and operation strategies. Attributes: commodity (str): Name of the commodity being controlled @@ -87,10 +88,32 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa ) max_supervisor_events: int | None = (field(default=None),) supervisor_event_period: int | str | None = field(default=None) - peak_range: dict = field(default={"start": time.min, "end": time.max}) - advance_discharge_period: dict = field(default={"units": "H", "val": 2}) - delay_charge_period: dict = field(default={"units": "H", "val": 4}) - allow_charge_in_peak_range: bool = field(default=True) + max_supervisor_event_period: int | str | None = field(default=None) + peak_range: dict = field( + default={"start": time.min, "end": time.max}, + metadata={ + "description": "Daily time window for peak detection. " + "Dict with 'start' and 'end' as datetime.time objects." + }, + ) + advance_discharge_period: dict = field( + default={"units": "H", "val": 2}, + metadata={ + "description": "How long before a peak to start discharging. " + "Dict with 'units' (timedelta unit str) and 'val' (numeric)." + }, + ) + delay_charge_period: dict = field( + default={"units": "H", "val": 4}, + metadata={ + "description": "Minimum delay after discharge completes before charging resumes. " + "Dict with 'units' and 'val'." + }, + ) + allow_charge_in_peak_range: bool = field( + default=True, + metadata={"description": "If False, charging is suppressed during peak_range."}, + ) def __attrs_post_init__(self): """ @@ -134,14 +157,34 @@ def __attrs_post_init__(self): class PeakLoadManagementOpenLoopStorageController(StorageOpenLoopControlBase): """ - A controller that manages commodity flow based on demand and storage constraints. + Peak-load management storage controller implementing an open-loop control strategy. + + This controller manages commodity (e.g., hydrogen) storage to reduce detected demand peaks. + It detects peaks in the demand profile using configurable time + windows and event limits, then uses multi-stage state machine control to: - The `DemandOpenLoopStorageController` computes the dispatch commands for a commodity storage - system. It uses a demand profile and storage parameters to determine how much of the - commodity to charge, discharge, or curtail at each time step. + 1. Discharge storage in advance of peaks (configurable lead time) + 2. Charge storage during expected low-demand periods (using provided charging window bounds) + 3. Enforce SOC, rate, and efficiency limits throughout + + The controller uses an open-loop architecture where peak discharge/charge decisions are + pre-planned during setup() rather than dynamically optimized during compute(). """ def setup(self): + """Initialize controller configuration, storage inputs, and compute peak schedules. + + During setup: + 1. Loads and validates configuration from tech_config and plant_config options + 2. Registers OpenMDAO inputs for storage parameters (capacity, charge rates, etc.) + 3. Detects peaks in the demand profile (supervisor and secondary) + 4. Merges peaks with supervisor prioritization if configured + 5. Computes time-to-next-peak for each timestep + 6. Identifies allowed charging windows based on peak_range configuration + + Raises: + ValueError: If configuration is invalid or required keys are missing + """ self.config = PeakLoadManagementOpenLoopStorageController.from_dict( merge_shared_inputs(self.options["tech_config"]["model_inputs"], "control"), strict=False, @@ -151,19 +194,19 @@ def setup(self): self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] - # Design constraints of storage system + # Register storage system design constraint inputs self.add_input( "max_charge_rate", val=self.config.max_charge_rate, units=self.config.commodity_rate_units, - desc="Storage charge/discharge rate", + desc="Maximum charging rate for the storage system", ) self.add_input( "storage_capacity", val=self.config.max_capacity, units=self.config.commodity_amount_units, - desc="Maximum storage capacity", + desc="Total storage capacity (including unusable amounts)", ) if not self.config.charge_equals_discharge: @@ -171,16 +214,13 @@ def setup(self): "max_discharge_rate", val=self.config.max_discharge_rate, units=self.config.commodity_rate_units, - desc="Storage discharge rate", + desc="Maximum discharging rate for the storage system", ) - # n_timesteps is number of timesteps in a simulation - self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] - - # dt is seconds per timestep + # Store simulation parameters for later use self.dt = self.options["plant_config"]["plant"]["simulation"]["dt"] - # determine demand_profile_supervisor peaks + # Detect peaks in supervisor demand profile (if provided) if self.config.demand_profile_supervisor is not None: self.supervisor_peaks_df = self.get_peaks( demand_profile=self.config.demand_profile_supervisor, @@ -191,10 +231,10 @@ def setup(self): else: self.supervisor_peaks_df = None - # determine demand_profile peaks using defaults of daily peaks inside peak_range - # for the full simulation but respecting the peak range specified in the config + # Detect daily peaks in secondary demand profile (always computed) + # Respects the configured peak_range time window for each day self.secondary_peaks_df = self.get_peaks( - demand_profile=self.condig.demand_profile, + demand_profile=self.config.demand_profile, peak_range=self.config.peak_range, ) @@ -243,14 +283,14 @@ def compute(self, inputs, outputs): None """ - # we need to discharge starting at advance_discharge_period before each peak - # we also need to only discharge the peak_range - # we also need to discharge until the SOC is at the min_soc - # discharge at the max discharge rate always except to reach min charge - - # we need to charge soon after the battery reaches the min_charge, but not too soon - # we cannot charge during the peak range if allow_charge_during_peak is False - # charge at the max charge rate always except to reach max charge + # Dispatch strategy outline: + # - Discharge: Starting when time_to_peak <= advance_discharge_period + # * Discharge at max rate (or less to reach targets) + # * Stop discharging only when SOC reaches min_soc + # - Charge: When not discharging, SOC < max, and allow_charge window is active + # * Start charging only after delay_charge_period since last discharge + # * Charge at max rate (or less to reach target) + # * Stop charging when SOC reaches max_soc commodity = self.config.commodity if np.all(inputs[f"{commodity}_demand"] == 0.0): @@ -294,21 +334,22 @@ def compute(self, inputs, outputs): soc_array = np.zeros(self.n_timesteps) set_point_array = np.zeros(self.n_timesteps) - # we need a bool to track if we are discharging or charging or neither + # State machine to track discharge/charge mode discharging = False charging = False advance_discharge_period = pd.Timedelta(self.config.advance_discharge_period) delay_charge_period = pd.Timedelta(self.config.delay_charge_period) + # Initialize: no discharge has occurred yet last_discharge = self.peaks_df["time_date"].iloc[0] - delay_charge_period - # Loop through each time step - for i, demand_t in enumerate(self.peaks_df["demand"].tolist()): - td = self.peaks_df["time_date"] + # Process each timestep using the pre-computed peak schedule + for i, _demand_t in enumerate(self.peaks_df["demand"].tolist()): + td = self.peaks_df["time_date"].iloc[i] time_to_peak = self.peaks_df["time_to_peak"].iloc[i] # Get the input flow at the current time step - input_flow = inputs[f"{commodity}_in"][i] + inputs[f"{commodity}_in"][i] # Calculate the available charge/discharge capacity available_charge = float((soc_max - soc) * max_capacity) @@ -319,34 +360,31 @@ def compute(self, inputs, outputs): discharging = True if not discharging and soc < soc_max: - if self.peaks_df["allow_discharge"].iloc[i]: + if self.peaks_df["allow_charge"].iloc[i]: if (td - last_discharge) > delay_charge_period: charging = True if discharging: - # Discharge storage to meet demand. - # `discharge_needed` is as seen by the storage + # DISCHARGE MODE: Supply commodity to meet peak demand + # Note: discharge_needed is internal (storage view), max_discharge_rate is external discharge_needed = max_discharge_rate / discharge_eff - # `discharge` is as seen by the storage, but `max_discharge_rate` is as observed - # outside the storage discharge = min( discharge_needed, available_discharge, max_discharge_rate / discharge_eff ) - soc -= discharge / max_capacity # soc is a ratio with value between 0 and 1 - # output is as observed outside the storage, so we need to adjust `discharge` by - # applying `discharge_efficiency`. + soc -= discharge / max_capacity # Deplete storage state of charge + # Output setpoint is the external (delivered) rate after efficiency loss set_point_array[i] = discharge * discharge_eff - # get time discharge completion + # Mark discharge completion time for charging delay calculation if soc <= soc_min: last_discharge = td elif charging: - # Charge storage with unused input - # `unused_input` is as seen outside the storage - unused_input = input_flow - demand_t - unused_input = unused_input.item() + # CHARGE MODE: Store commodity by charging from assumed infinite source + # unused_input is external (delivered commodity not needed for demand) + # unused_input = input_flow - demand_t + # unused_input = unused_input.item() # `charge` is as seen by the storage, but the things being compared should all be as # seen outside the storage so we need to adjust `available_charge` outside the # storage view and the final result back into the storage view. @@ -376,18 +414,39 @@ def get_peaks( min_proximity=None, peak_range={"start": time.min, "end": time.max}, ): - """Determines the peaks of the demand profile + """Detect demand peaks using configurable time windows and event limits. + + Identifies peak demand periods from a demand profile, with control over: + - Daily time windows (e.g., peak detection only 12:00-17:00 each day) + - Event frequency (e.g., max 1 peak per week) + - Temporal spacing (e.g., minimum 24 hours between peaks) Args: - demand_profile (dict): with keys "time_date" and "demand" - max_events (_type_, optional): _description_. Defaults to None. - max_events_period (_type_, optional): _description_. Defaults to None. - min_proximity (dict | None, optional): Minimum spacing between peaks, - provided as {"units": , "val": }. - peak_range (dict, optional): Daily time window used to determine - candidate peaks, with keys {"start", "end"} as `datetime.time`. - Defaults to include the full day. Start must come before end and both - must be in the same day. + demand_profile (dict): Timeseries data with keys: + - 'time_date': timestamps (list or DatetimeIndex convertible) + - 'demand': demand values (list or array) + n_max_events (int | None): Maximum number of peaks to keep globally or per period. + If None, returns all daily peaks. Defaults to None. + max_events_period (int | str | None): Grouping period for n_max_events limit. + - None: apply n_max_events limit globally (keep top-N peaks overall) + - int: group by timestep intervals (e.g., 288 for 24-hour periods) + - str: pandas period frequency (e.g., 'W' for week, 'M' for month) + Defaults to None. + min_proximity (dict | None): Minimum time gap between sequential peaks. + Dict with keys {'units': , 'val': }. + Example: {'units': 'D', 'val': 1} enforces 1-day minimum gap. + Raises ValueError if violated. Defaults to None (no constraint). + peak_range (dict, optional): Daily time window for peak detection. Dict with keys: + - 'start': datetime.time object (inclusive) + - 'end': datetime.time object (inclusive) + Defaults to full day (time.min to time.max). + + Returns: + pd.DataFrame: Input demand_profile with added 'is_peak' boolean column. + Each row is True if that timestep is a peak, False otherwise. + + Raises: + ValueError: If configuration is invalid (bad period frequency, type mismatches, etc.) """ # create dataframe from dictionary @@ -395,46 +454,52 @@ def get_peaks( if "time_date" not in demand_df or "demand" not in demand_df: raise ValueError("demand_profile must include 'time_date' and 'demand' keys") + # Normalize timestamps and tag by day demand_df["time_date"] = pd.to_datetime(demand_df["time_date"]) demand_df["period_day"] = demand_df["time_date"].dt.floor("D") + # Validate and apply time-of-day window if not isinstance(peak_range["start"], time) or not isinstance(peak_range["end"], time): raise ValueError("peak_range['start'] and peak_range['end'] must be datetime.time") time_of_day = demand_df["time_date"].dt.time if peak_range["start"] <= peak_range["end"]: + # Normal window: 12:00-17:00 in_peak_range = (time_of_day >= peak_range["start"]) & ( time_of_day <= peak_range["end"] ) else: - raise (ValueError("Peak range start must come before peak range end in the same day")) + raise ValueError("Peak range start must come before peak range end in the same day") - # flag daily peaks up to n_max_events per max_events_period unless None, then flag all - # daily peaks. When using max events, the highest n_max_events in the max_events_period - # should be used. + # Identify highest-demand timestep within each day's peak window demand_df["is_peak"] = False daily_peak_idx = demand_df.loc[in_peak_range].groupby("period_day")["demand"].idxmax() demand_df.loc[daily_peak_idx, "is_peak"] = True + # Optional: Limit number of peaks globally or per period if n_max_events is not None: if n_max_events < 0: - raise ValueError("n_max_events must be >= 0") + raise ValueError("n_max_events must be >= 0 or None") peak_candidates = demand_df.loc[demand_df["is_peak"]].copy() keep_idx = [] if max_events_period is None: + # Global limit: keep the N largest peaks across all time keep_idx = peak_candidates.nlargest(n_max_events, "demand").index.tolist() else: + # Period-based limit: keep top-N peaks within each period if isinstance(max_events_period, int): if max_events_period <= 0: raise ValueError( "max_events_period must be positive when provided as an int" ) + # Group by timestep intervals (e.g., 288 timesteps = 1 day) demand_df["period_id"] = np.arange(len(demand_df)) // max_events_period peak_candidates["period_id"] = demand_df.loc[peak_candidates.index, "period_id"] elif isinstance(max_events_period, str): + # Group by pandas period frequency (W=week, M=month, etc.) period_freq = max_events_period.strip() try: demand_df["period_id"] = demand_df["time_date"].dt.to_period(period_freq) @@ -451,14 +516,17 @@ def get_peaks( "frequency string" ) + # Within each period, retain only the top-N peaks by demand for _, period_group in peak_candidates.groupby("period_id"): keep_idx.extend(period_group.nlargest(n_max_events, "demand").index.tolist()) demand_df = demand_df.drop(columns=["period_id"]) + # Reset "is_peak" flags and reapply only to surviving indices demand_df["is_peak"] = False demand_df.loc[keep_idx, "is_peak"] = True + # Optional: Validate minimum spacing between consecutive peaks if min_proximity is not None: if not isinstance(min_proximity, dict): raise ValueError("min_proximity must be a dict with keys 'units' and 'val'") @@ -472,8 +540,10 @@ def get_peaks( if not isinstance(val, int | float) or val < 0: raise ValueError("min_proximity['val'] must be a non-negative number") + # Convert specification to timedelta min_delta = pd.to_timedelta(val, unit=units.strip()) if min_delta > pd.Timedelta(0): + # Check consecutive peak spacing selected_peaks = demand_df.loc[demand_df["is_peak"], ["time_date", "demand"]] selected_peaks = selected_peaks.sort_values("time_date") @@ -488,14 +558,34 @@ def get_peaks( return demand_df.drop(columns=["period_day"]) def merge_peaks(supervisory_peaks_df, secondary_peaks_df): - # take exactly one peak per day with supervisor_peaks taking precedence if present - # the result should be a dictionary with time_date and "is_peak" bool + """Merge supervisor and secondary peak schedules with supervisor precedence. + + Combines two peak schedules (primary and fallback) using day-level precedence: + - For each day, if the primary (supervisory) profile has any peaks on that day, + use all primary peaks for that day + - Otherwise, use the secondary peaks for that day + + This allows critical demand (supervisor) to take scheduling precedence while + falling back to secondary peaks for days with no critical demand. + + Args: + supervisory_peaks_df (pd.DataFrame | None): Primary peak schedule with columns + ['time_date', 'is_peak', 'demand', ...]. If None, secondary peaks are used. + secondary_peaks_df (pd.DataFrame): Secondary/fallback peak schedule with same columns. + + Returns: + pd.DataFrame: Merged peak schedule. If supervisory is None, returns secondary unchanged. + Otherwise, returns secondary with 'is_peak' flags overridden on supervisor-peak + days. + """ peaks_df = secondary_peaks_df.copy() if supervisory_peaks_df is not None: + # For each day in the data, check if supervisor has any peaks for day in secondary_peaks_df["time_date"].dt.floor("D").unique(): day_df = supervisory_peaks_df[ supervisory_peaks_df["time_date"].dt.floor("D") == day ] + # If supervisor has peaks on the day, use supervisor's flags for all rows that day if any(day_df["is_peak"]): peaks_df["is_peak"][peaks_df["time_date"].dt.floor("D") == day] = day_df[ "is_peak" @@ -504,10 +594,23 @@ def merge_peaks(supervisory_peaks_df, secondary_peaks_df): return peaks_df def get_time_to_peak(self): - self.peaks_df["time_to_peak"] = ( - time.max - ) # TODO This may not be the best default. It will cause no charging at the end of the time series + """Compute time delta from each timestep to the next detected peak. + + For each row in peaks_df, determines how long until the next peak (marked + as is_peak=True) will occur. This enables the discharge trigger: when + time_to_peak <= advance_discharge_period, discharge mode activates. + + Timesteps after the final peak receive time.max as their time_to_peak value. + This default prevents charging at simulation end (since advance_discharge_period + will never be reached). TODO: Consider configurable end-of-horizon behavior. + + Side effect: Modifies self.peaks_df by adding/updating 'time_to_peak' column + with pd.Timedelta values or time.max. + """ + # Initialize with sentinel value for "no future peak" + self.peaks_df["time_to_peak"] = time.max for _i, idx in enumerate(self.peaks_df.index): + # Find next peak at or after current index next_peak_time = self.peaks_df.loc[ self.peaks_df["is_peak"] & (self.peaks_df.index >= idx), "time_date" ] @@ -516,19 +619,29 @@ def get_time_to_peak(self): self.peaks_df.loc[idx, "time_to_peak"] = ( next_peak_time - self.peaks_df.loc[idx, "time_date"] ) - else: - continue def get_allowed_discharge(self): - # we will also need to know if a point is in an allowed charging time + """Compute allowed charging time windows based on peak range configuration. + + Determines for each timestep whether charging is permitted. If + allow_charge_in_peak_range=True, charging is allowed at all times. + Otherwise, charging is suppressed during the configured peak_range window + (e.g., 12:00-17:00 each day) to prioritize meeting peak demand from storage. + + Side effect: Modifies self.peaks_df by adding/updating 'allow_charge' column + with boolean values (True=charging allowed, False=charging suppressed). + """ if self.config.allow_charge_in_peak_range: + # Global allow: charging always permitted self.peaks_df["allow_charge"] = True else: - # only allow_charge when time step is not in peak range + # Selective allow: suppress charging during peak window only self.peaks_df["allow_charge"] = False for i in range(self.n_timesteps): + time_of_day = self.peaks_df["time_date"].iloc[i].time() + # Allow charging if outside peak window if ( - self.peaks_df["time_date"].iloc[i].time() < self.config.peak_range["start"] - or self.peaks_df["time_date"].iloc[i].time() >= self.config.peak_range["end"] + time_of_day < self.config.peak_range["start"] + or time_of_day >= self.config.peak_range["end"] ): self.peaks_df["allow_charge"].iloc[i] = True From db0c72a5d17f44f70bbe6f44f40ad5d951938578 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Tue, 31 Mar 2026 16:18:22 -0600 Subject: [PATCH 06/49] seperate the demand and time series to separate config inputs --- .../plm_openloop_storage_controller.py | 114 +++++--- .../test_plm_openloop_storage_controller.py | 274 ++++++++++++++++-- 2 files changed, 336 insertions(+), 52 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 5f13d06a2..e8cb10fc6 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -56,9 +56,10 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa provided. commodity_amount_units (str | None, optional): Units of the commodity as an amount (i.e., kW*h or kg). If not provided, defaults to commodity_rate_units*h. - demand_profile_supervisor (dict | None, optional): Demand values for additional - connected system for each timestep, in the same units as `commodity_rate_units`. - May be a scalar for constant demand or a list/array for time-varying demand. + demand_profile_supervisor (int | float | list | None, optional): Demand values for + additional connected system for each timestep, in the same units as + `commodity_rate_units`. May be a scalar for constant demand or a list/array for + time-varying demand. dispatch_priority_demand_profile (str | None, optional): which demand profile takes precedence for dispatch decisions. max_supervisor_event_period: (int | None, optional): Duration, in time steps, of the period @@ -80,8 +81,8 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - demand_profile: dict = field() - demand_profile_supervisor: dict | None = field(default=None) + demand_profile: int | float | list = field() + demand_profile_supervisor: int | float | list | None = field(default=None) dispatch_priority_demand_profile: str = field( default="demand_profile_supervisor", validator=contains(["demand_profile", "demand_profile_supervisor"]), @@ -125,7 +126,6 @@ def __attrs_post_init__(self): of `round_trip_efficiency`. """ super().__attrs_post_init__() - if (self.round_trip_efficiency is not None) and ( self.charge_efficiency is None and self.discharge_efficiency is None ): @@ -185,7 +185,7 @@ def setup(self): Raises: ValueError: If configuration is invalid or required keys are missing """ - self.config = PeakLoadManagementOpenLoopStorageController.from_dict( + self.config = PeakLoadManagementOpenLoopStorageControllerConfig.from_dict( merge_shared_inputs(self.options["tech_config"]["model_inputs"], "control"), strict=False, additional_cls_name=self.__class__.__name__, @@ -219,11 +219,18 @@ def setup(self): # Store simulation parameters for later use self.dt = self.options["plant_config"]["plant"]["simulation"]["dt"] + self.time_index = self._build_time_index() + + # Build timestamped demand dictionaries from simulation timeline. + secondary_demand_profile = self._build_demand_profile_dict(self.config.demand_profile) # Detect peaks in supervisor demand profile (if provided) if self.config.demand_profile_supervisor is not None: + supervisor_demand_profile = self._build_demand_profile_dict( + self.config.demand_profile_supervisor + ) self.supervisor_peaks_df = self.get_peaks( - demand_profile=self.config.demand_profile_supervisor, + demand_profile=supervisor_demand_profile, n_max_events=self.config.max_supervisor_events, max_events_period=self.config.max_supervisor_event_period, min_proximity={"units": "H", "val": 4}, @@ -234,7 +241,7 @@ def setup(self): # Detect daily peaks in secondary demand profile (always computed) # Respects the configured peak_range time window for each day self.secondary_peaks_df = self.get_peaks( - demand_profile=self.config.demand_profile, + demand_profile=secondary_demand_profile, peak_range=self.config.peak_range, ) @@ -247,6 +254,37 @@ def setup(self): self.get_allowed_discharge() + def _build_time_index(self): + """Build a simulation time index from plant configuration. + + Uses `start_time` from simulation config when provided, otherwise defaults to + `2000-01-01 00:00:00`. The resulting index has `n_timesteps` entries and + spacing of `dt` seconds. + """ + simulation_config = self.options["plant_config"]["plant"]["simulation"] + start_time = simulation_config.get("start_time", "2000-01-01 00:00:00") + start_timestamp = pd.to_datetime(start_time) + freq = pd.to_timedelta(int(self.dt), unit="s") + return pd.date_range(start=start_timestamp, periods=self.n_timesteps, freq=freq) + + def _build_demand_profile_dict(self, demand_profile): + """Convert scalar/list demand input into a timestamped demand dictionary.""" + if np.isscalar(demand_profile): + demand_values = np.full(self.n_timesteps, float(demand_profile), dtype=float) + else: + demand_values = np.asarray(demand_profile, dtype=float) + + if len(demand_values) != self.n_timesteps: + raise ValueError( + "demand_profile length must equal n_timesteps " + f"({len(demand_values)} != {self.n_timesteps})" + ) + + return { + "date_time": self.time_index, + "demand": demand_values, + } + def compute(self, inputs, outputs): """ Compute storage state of charge (SOC), delivered output, curtailment, and unmet @@ -337,15 +375,22 @@ def compute(self, inputs, outputs): # State machine to track discharge/charge mode discharging = False charging = False - advance_discharge_period = pd.Timedelta(self.config.advance_discharge_period) - delay_charge_period = pd.Timedelta(self.config.delay_charge_period) + + advance_discharge_period = pd.Timedelta( + value=self.config.advance_discharge_period["val"], + unit=self.config.advance_discharge_period["units"], + ) + delay_charge_period = pd.Timedelta( + value=self.config.delay_charge_period["val"], + unit=self.config.delay_charge_period["units"], + ) # Initialize: no discharge has occurred yet - last_discharge = self.peaks_df["time_date"].iloc[0] - delay_charge_period + last_discharge = self.peaks_df["date_time"].iloc[0] - delay_charge_period # Process each timestep using the pre-computed peak schedule for i, _demand_t in enumerate(self.peaks_df["demand"].tolist()): - td = self.peaks_df["time_date"].iloc[i] + td = self.peaks_df["date_time"].iloc[i] time_to_peak = self.peaks_df["time_to_peak"].iloc[i] # Get the input flow at the current time step @@ -406,8 +451,8 @@ def compute(self, inputs, outputs): outputs[f"{commodity}_set_point"] = set_point_array + @staticmethod def get_peaks( - self, demand_profile: dict, n_max_events=None, max_events_period=None, @@ -423,7 +468,7 @@ def get_peaks( Args: demand_profile (dict): Timeseries data with keys: - - 'time_date': timestamps (list or DatetimeIndex convertible) + - 'date_time': timestamps (list or DatetimeIndex convertible) - 'demand': demand values (list or array) n_max_events (int | None): Maximum number of peaks to keep globally or per period. If None, returns all daily peaks. Defaults to None. @@ -449,19 +494,21 @@ def get_peaks( ValueError: If configuration is invalid (bad period frequency, type mismatches, etc.) """ - # create dataframe from dictionary + if not isinstance(demand_profile, dict): + raise ValueError("demand_profile must be a dict with 'date_time' and 'demand' keys") + demand_df = pd.DataFrame(demand_profile) - if "time_date" not in demand_df or "demand" not in demand_df: - raise ValueError("demand_profile must include 'time_date' and 'demand' keys") + if "date_time" not in demand_df or "demand" not in demand_df: + raise ValueError("demand_profile must include 'date_time' and 'demand' keys") # Normalize timestamps and tag by day - demand_df["time_date"] = pd.to_datetime(demand_df["time_date"]) - demand_df["period_day"] = demand_df["time_date"].dt.floor("D") + demand_df["date_time"] = pd.to_datetime(demand_df["date_time"]) + demand_df["period_day"] = demand_df["date_time"].dt.floor("D") # Validate and apply time-of-day window if not isinstance(peak_range["start"], time) or not isinstance(peak_range["end"], time): raise ValueError("peak_range['start'] and peak_range['end'] must be datetime.time") - time_of_day = demand_df["time_date"].dt.time + time_of_day = demand_df["date_time"].dt.time if peak_range["start"] <= peak_range["end"]: # Normal window: 12:00-17:00 in_peak_range = (time_of_day >= peak_range["start"]) & ( @@ -502,7 +549,7 @@ def get_peaks( # Group by pandas period frequency (W=week, M=month, etc.) period_freq = max_events_period.strip() try: - demand_df["period_id"] = demand_df["time_date"].dt.to_period(period_freq) + demand_df["period_id"] = demand_df["date_time"].dt.to_period(period_freq) except ValueError as exc: raise ValueError( "Invalid max_events_period string. Use a pandas period frequency " @@ -544,11 +591,11 @@ def get_peaks( min_delta = pd.to_timedelta(val, unit=units.strip()) if min_delta > pd.Timedelta(0): # Check consecutive peak spacing - selected_peaks = demand_df.loc[demand_df["is_peak"], ["time_date", "demand"]] - selected_peaks = selected_peaks.sort_values("time_date") + selected_peaks = demand_df.loc[demand_df["is_peak"], ["date_time", "demand"]] + selected_peaks = selected_peaks.sort_values("date_time") if len(selected_peaks) > 1: - deltas = selected_peaks["time_date"].diff().dropna() + deltas = selected_peaks["date_time"].diff().dropna() if (deltas < min_delta).any(): raise ValueError( "Selected peaks violate min_proximity. " @@ -557,6 +604,7 @@ def get_peaks( return demand_df.drop(columns=["period_day"]) + @staticmethod def merge_peaks(supervisory_peaks_df, secondary_peaks_df): """Merge supervisor and secondary peak schedules with supervisor precedence. @@ -570,7 +618,7 @@ def merge_peaks(supervisory_peaks_df, secondary_peaks_df): Args: supervisory_peaks_df (pd.DataFrame | None): Primary peak schedule with columns - ['time_date', 'is_peak', 'demand', ...]. If None, secondary peaks are used. + ['date_time', 'is_peak', 'demand', ...]. If None, secondary peaks are used. secondary_peaks_df (pd.DataFrame): Secondary/fallback peak schedule with same columns. Returns: @@ -581,13 +629,13 @@ def merge_peaks(supervisory_peaks_df, secondary_peaks_df): peaks_df = secondary_peaks_df.copy() if supervisory_peaks_df is not None: # For each day in the data, check if supervisor has any peaks - for day in secondary_peaks_df["time_date"].dt.floor("D").unique(): + for day in secondary_peaks_df["date_time"].dt.floor("D").unique(): day_df = supervisory_peaks_df[ - supervisory_peaks_df["time_date"].dt.floor("D") == day + supervisory_peaks_df["date_time"].dt.floor("D") == day ] # If supervisor has peaks on the day, use supervisor's flags for all rows that day if any(day_df["is_peak"]): - peaks_df["is_peak"][peaks_df["time_date"].dt.floor("D") == day] = day_df[ + peaks_df["is_peak"][peaks_df["date_time"].dt.floor("D") == day] = day_df[ "is_peak" ] @@ -608,16 +656,16 @@ def get_time_to_peak(self): with pd.Timedelta values or time.max. """ # Initialize with sentinel value for "no future peak" - self.peaks_df["time_to_peak"] = time.max + self.peaks_df["time_to_peak"] = pd.Timedelta(value=24, unit="h") for _i, idx in enumerate(self.peaks_df.index): # Find next peak at or after current index next_peak_time = self.peaks_df.loc[ - self.peaks_df["is_peak"] & (self.peaks_df.index >= idx), "time_date" + self.peaks_df["is_peak"] & (self.peaks_df.index >= idx), "date_time" ] if len(next_peak_time) > 0: next_peak_time = next_peak_time.iloc[0] self.peaks_df.loc[idx, "time_to_peak"] = ( - next_peak_time - self.peaks_df.loc[idx, "time_date"] + next_peak_time - self.peaks_df.loc[idx, "date_time"] ) def get_allowed_discharge(self): @@ -638,7 +686,7 @@ def get_allowed_discharge(self): # Selective allow: suppress charging during peak window only self.peaks_df["allow_charge"] = False for i in range(self.n_timesteps): - time_of_day = self.peaks_df["time_date"].iloc[i].time() + time_of_day = self.peaks_df["date_time"].iloc[i].time() # Allow charging if outside peak window if ( time_of_day < self.config.peak_range["start"] diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 2750afd0c..61fe81ba7 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -5,7 +5,10 @@ import numpy as np import pandas as pd import pytest +import openmdao.api as om +from h2integrate.core.file_utils import load_yaml +from h2integrate.storage.storage_performance_model import StoragePerformanceModel from h2integrate.control.control_strategies.storage.plm_openloop_storage_controller import ( PeakLoadManagementOpenLoopStorageController, ) @@ -21,7 +24,7 @@ def test_get_peaks_daily_expected_peaks(): controller = _controller_without_setup() demand_profile = { - "time_date": pd.date_range("2025-01-01", periods=8, freq="6h"), + "date_time": pd.date_range("2025-01-01", periods=8, freq="6h"), "demand": [1.0, 9.0, 3.0, 2.0, 4.0, 5.0, 2.0, 8.0], } @@ -31,7 +34,7 @@ def test_get_peaks_daily_expected_peaks(): ] peaks = controller.get_peaks(demand_profile) - actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + actual_peak_times = peaks.loc[peaks["is_peak"], "date_time"].tolist() assert actual_peak_times == expected_peak_times @@ -41,14 +44,14 @@ def test_get_peaks_with_global_event_limit_expected_peak(): controller = _controller_without_setup() demand_profile = { - "time_date": pd.date_range("2025-01-01", periods=8, freq="6h"), + "date_time": pd.date_range("2025-01-01", periods=8, freq="6h"), "demand": [1.0, 9.0, 3.0, 2.0, 4.0, 5.0, 2.0, 8.0], } expected_peak_times = [pd.Timestamp("2025-01-01 06:00:00")] peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period=None) - actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + actual_peak_times = peaks.loc[peaks["is_peak"], "date_time"].tolist() assert actual_peak_times == expected_peak_times @@ -58,7 +61,7 @@ def test_get_peaks_with_month_period_expected_peaks(): controller = _controller_without_setup() demand_profile = { - "time_date": [ + "date_time": [ pd.Timestamp("2025-01-01 00:00:00"), pd.Timestamp("2025-01-01 12:00:00"), pd.Timestamp("2025-01-02 00:00:00"), @@ -86,7 +89,7 @@ def test_get_peaks_with_month_period_expected_peaks(): ] peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period="M") - actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + actual_peak_times = peaks.loc[peaks["is_peak"], "date_time"].tolist() assert actual_peak_times == expected_peak_times @@ -99,14 +102,14 @@ def test_get_peaks_with_month_period_from_csv_expected_peaks(): expected_peaks_df = pd.read_csv(data_dir / "lmp_peaks_month_1.csv") demand_profile = { - "time_date": demand_profile_df["time_mountain"].to_list(), + "date_time": demand_profile_df["time_mountain"].to_list(), "demand": demand_profile_df["energy"].to_list(), } expected_peak_times = pd.to_datetime(expected_peaks_df["time_mountain"]).to_list() peaks = controller.get_peaks(demand_profile, n_max_events=10, max_events_period="M") - actual_peak_times = pd.to_datetime(peaks.loc[peaks["is_peak"], "time_date"]).tolist() + actual_peak_times = pd.to_datetime(peaks.loc[peaks["is_peak"], "date_time"]).tolist() assert actual_peak_times == expected_peak_times @@ -116,7 +119,7 @@ def test_get_peaks_invalid_period_string_raises(): controller = _controller_without_setup() demand_profile = { - "time_date": pd.date_range("2025-01-01", periods=4, freq="6h"), + "date_time": pd.date_range("2025-01-01", periods=4, freq="6h"), "demand": [1.0, 2.0, 3.0, 4.0], } @@ -129,7 +132,7 @@ def test_get_peaks_respects_peak_range_12pm_to_5pm(): controller = _controller_without_setup() demand_profile = { - "time_date": [ + "date_time": [ pd.Timestamp("2025-01-01 09:00:00"), pd.Timestamp("2025-01-01 14:00:00"), pd.Timestamp("2025-01-01 18:00:00"), @@ -155,7 +158,7 @@ def test_get_peaks_respects_peak_range_12pm_to_5pm(): demand_profile, peak_range={"start": time(12, 0), "end": time(17, 0)}, ) - actual_peak_times = peaks.loc[peaks["is_peak"], "time_date"].tolist() + actual_peak_times = peaks.loc[peaks["is_peak"], "date_time"].tolist() expected_peak_times = [ pd.Timestamp("2025-01-01 14:00:00"), @@ -170,7 +173,7 @@ def test_get_peaks_invalid_min_proximity_raises(): controller = _controller_without_setup() demand_profile = { - "time_date": pd.date_range("2025-01-01", periods=10, freq="6h"), + "date_time": pd.date_range("2025-01-01", periods=10, freq="6h"), "demand": [1.0, 2.0, 4.0, 3.0, 3.0, 4.0, 3.0, 2.0, 1.0, 2.0], } @@ -187,7 +190,7 @@ def test_get_peaks_invalid_min_proximity_raises(): def test_merge_peaks_without_supervisor_returns_secondary_flags(subtests): secondary_peaks_df = pd.DataFrame( { - "time_date": pd.to_datetime( + "date_time": pd.to_datetime( [ "2025-01-01 14:00:00", "2025-01-01 18:00:00", @@ -210,7 +213,7 @@ def test_merge_peaks_without_supervisor_returns_secondary_flags(subtests): def test_merge_peaks_supervisor_takes_precedence_on_same_day(subtests): secondary_peaks_df = pd.DataFrame( { - "time_date": pd.to_datetime( + "date_time": pd.to_datetime( [ "2025-01-01 14:00:00", "2025-01-01 18:00:00", @@ -224,7 +227,7 @@ def test_merge_peaks_supervisor_takes_precedence_on_same_day(subtests): ) supervisory_peaks_df = pd.DataFrame( { - "time_date": pd.to_datetime( + "date_time": pd.to_datetime( [ "2025-01-01 14:00:00", "2025-01-01 18:00:00", @@ -269,7 +272,7 @@ def test_get_time_to_peak_single_peak(subtests): ) controller.peaks_df = pd.DataFrame( { - "time_date": times, + "date_time": times, "is_peak": [False, False, True, False], "demand": [1.0, 2.0, 5.0, 3.0], } @@ -301,7 +304,7 @@ def test_get_time_to_peak_multiple_peaks(subtests): ) controller.peaks_df = pd.DataFrame( { - "time_date": times, + "date_time": times, "is_peak": [False, True, False, True, False], "demand": [1.0, 8.0, 2.0, 7.0, 1.0], } @@ -340,7 +343,7 @@ def test_get_allowed_discharge_always_true_when_charge_allowed_in_peak_range(): ) controller.peaks_df = pd.DataFrame( { - "time_date": pd.to_datetime( + "date_time": pd.to_datetime( [ "2025-01-01 09:00:00", "2025-01-01 14:00:00", # inside peak range @@ -367,7 +370,7 @@ def test_get_allowed_discharge_blocks_charge_inside_peak_range(subtests): ) controller.peaks_df = pd.DataFrame( { - "time_date": pd.to_datetime( + "date_time": pd.to_datetime( [ "2025-01-01 09:00:00", # before range → allow "2025-01-01 14:00:00", # inside range → block @@ -391,3 +394,236 @@ def test_get_allowed_discharge_blocks_charge_inside_peak_range(subtests): assert controller.peaks_df["allow_charge"].iloc[2] is np.False_ with subtests.test("after range allows charge"): assert controller.peaks_df["allow_charge"].iloc[3] is np.True_ + + +@pytest.mark.regression +def test_plm_controller_basic_discharge_before_peak(subtests): + """Test PLM controller discharges before detected peak and charges after.""" + current_dir = Path(__file__).parent + + # Load base tech config + tech_config_path = current_dir / "inputs" / "tech_config.yaml" + tech_config = load_yaml(tech_config_path) + + # Configure PLM-specific parameters + tech_config["technologies"]["h2_storage"]["model_inputs"]["shared_parameters"] = { + "commodity": "hydrogen", + "commodity_rate_units": "kg/h", + "max_capacity": 100.0, # kg + "max_soc_fraction": 1.0, + "min_soc_fraction": 0.1, + "init_soc_fraction": 0.9, + "max_charge_rate": 20.0, # kg/time step + "max_discharge_rate": 30.0, # kg/time step + "charge_equals_discharge": False, + "charge_efficiency": 0.95, + "discharge_efficiency": 0.95, + "demand_profile": [10.0] * 10 + [50.0] * 4 + [10.0] * 10, # Peak at hours 10-14 + "peak_range": {"start": time(10, 0), "end": time(14, 0)}, + "advance_discharge_period": {"units": "h", "val": 2}, + "delay_charge_period": {"units": "h", "val": 1}, + "allow_charge_in_peak_range": False, + } + + tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( + "PeakLoadManagementOpenLoopStorageController" + ) + + plant_config = {"plant": {"plant_life": 30, "simulation": {"n_timesteps": 24, "dt": 3600}}} + + # Set up OpenMDAO problem + prob = om.Problem() + + prob.model.add_subsystem( + name="IVC", + subsys=om.IndepVarComp(name="hydrogen_in", val=[30.0] * 24), + promotes=["*"], + ) + + prob.model.add_subsystem( + "plm_controller", + PeakLoadManagementOpenLoopStorageController( + plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] + ), + promotes=["*"], + ) + + prob.model.add_subsystem( + "storage", + StoragePerformanceModel( + plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] + ), + promotes=["*"], + ) + + prob.setup() + prob.run_model() + + set_point = prob.get_val("hydrogen_set_point", units="kg/h") + soc = prob.get_val("SOC", units="unitless") + + with subtests.test("Discharge occurs before peak (hours 8-9)"): + # Hours 8-9 are 2 hours before peak at hour 10 + # We expect discharge (positive set_point) + assert set_point[8] > 0 and set_point[9] > 0 + + with subtests.test("Peak triggers discharge (hours 10-13)"): + # High demand period should be reduced by discharge + assert all(set_point[10:13] >= 0) + + with subtests.test("SOC decreases during discharge phase"): + # SOC should drop after discharge begins + assert soc[8] < soc[7] + + with subtests.test("SOC recovers during charging phase"): + # After peak, SOC should increase due to charging + assert any(soc[15:] > soc[14]) + + +@pytest.mark.regression +def test_plm_controller_respects_soc_bounds(subtests): + """Test PLM controller respects min/max SOC constraints.""" + current_dir = Path(__file__).parent + tech_config_path = current_dir / "inputs" / "tech_config.yaml" + tech_config = load_yaml(tech_config_path) + + tech_config["technologies"]["h2_storage"]["model_inputs"]["shared_parameters"] = { + "commodity": "hydrogen", + "commodity_rate_units": "kg/h", + "max_capacity": 50.0, + "max_soc_fraction": 0.95, + "min_soc_fraction": 0.15, + "init_soc_fraction": 0.5, + "max_charge_rate": 15.0, + "max_discharge_rate": 15.0, + "charge_equals_discharge": True, + "charge_efficiency": 0.9, + "discharge_efficiency": 0.9, + "demand_profile": [5.0] * 12, + "peak_range": {"start": time(6, 0), "end": time(9, 0)}, + "advance_discharge_period": {"units": "h", "val": 1}, + "delay_charge_period": {"units": "h", "val": 1}, + "allow_charge_in_peak_range": True, + } + + tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( + "PeakLoadManagementOpenLoopStorageController" + ) + + plant_config = {"plant": {"plant_life": 30, "simulation": {"n_timesteps": 12, "dt": 3600}}} + + prob = om.Problem() + + prob.model.add_subsystem( + name="IVC", + subsys=om.IndepVarComp(name="hydrogen_in", val=[20.0] * 12), + promotes=["*"], + ) + + prob.model.add_subsystem( + "plm_controller", + PeakLoadManagementOpenLoopStorageController( + plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] + ), + promotes=["*"], + ) + + prob.model.add_subsystem( + "storage", + StoragePerformanceModel( + plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] + ), + promotes=["*"], + ) + + prob.setup() + prob.run_model() + + soc = prob.get_val("SOC", units="unitless") + min_soc = 0.15 + max_soc = 0.95 + + with subtests.test("SOC never exceeds maximum"): + assert np.all(soc <= max_soc + 1e-6) + + with subtests.test("SOC never falls below minimum"): + assert np.all(soc >= min_soc - 1e-6) + + +@pytest.mark.regression +def test_plm_controller_blocking_charge_in_peak_range(subtests): + """Test PLM controller blocks charging during peak window when configured.""" + current_dir = Path(__file__).parent + tech_config_path = current_dir / "inputs" / "tech_config.yaml" + tech_config = load_yaml(tech_config_path) + + peak_window_start = time(10, 0) + peak_window_end = time(14, 0) + + tech_config["technologies"]["h2_storage"]["model_inputs"]["shared_parameters"] = { + "commodity": "hydrogen", + "commodity_rate_units": "kg/h", + "max_capacity": 80.0, + "max_soc_fraction": 1.0, + "min_soc_fraction": 0.05, + "init_soc_fraction": 0.3, + "max_charge_rate": 15.0, + "max_discharge_rate": 25.0, + "charge_equals_discharge": False, + "charge_efficiency": 0.92, + "discharge_efficiency": 0.92, + "demand_profile": [5.0] * 24, + "peak_range": {"start": peak_window_start, "end": peak_window_end}, + "advance_discharge_period": {"units": "h", "val": 3}, + "delay_charge_period": {"units": "h", "val": 1}, + "allow_charge_in_peak_range": False, # Block charging in peak window + } + + tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( + "PeakLoadManagementOpenLoopStorageController" + ) + + plant_config = {"plant": {"plant_life": 30, "simulation": {"n_timesteps": 24, "dt": 3600}}} + + prob = om.Problem() + + prob.model.add_subsystem( + name="IVC", + subsys=om.IndepVarComp(name="hydrogen_in", val=[40.0] * 24), + promotes=["*"], + ) + + prob.model.add_subsystem( + "plm_controller", + PeakLoadManagementOpenLoopStorageController( + plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] + ), + promotes=["*"], + ) + + prob.model.add_subsystem( + "storage", + StoragePerformanceModel( + plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] + ), + promotes=["*"], + ) + + prob.setup() + prob.run_model() + + set_point = prob.get_val("hydrogen_set_point", units="kg/h") + soc = prob.get_val("SOC", units="unitless") + + with subtests.test("Controller instantiates and runs without error"): + assert len(set_point) == 24 + assert len(soc) == 24 + + with subtests.test("Initial discharge phase occurs before peak window"): + # Hours 7-9 are before the peak window (10-14) + # Some discharge should occur + assert any(set_point[7:10] > 1.0) + + with subtests.test("SOC is lower after peak window than before"): + # After discharge and attempted peak meeting, SOC should be lower + assert soc[14] < soc[6] From d5b42506f3eeb963d126cee3060a49c0bf252a80 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Tue, 31 Mar 2026 17:12:17 -0600 Subject: [PATCH 07/49] regression tests working --- examples/32_multivariable_streams/driver_config.yaml | 2 +- .../storage/test/test_plm_openloop_storage_controller.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/32_multivariable_streams/driver_config.yaml b/examples/32_multivariable_streams/driver_config.yaml index 0991d8889..801fe95fe 100644 --- a/examples/32_multivariable_streams/driver_config.yaml +++ b/examples/32_multivariable_streams/driver_config.yaml @@ -1,5 +1,5 @@ name: driver_config -description: Driver configuration for multivariable streams example +description: Driver configuration for peak load management example general: folder_output: outputs create_om_reports: false diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 61fe81ba7..1ad247824 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -543,6 +543,10 @@ def test_plm_controller_respects_soc_bounds(subtests): min_soc = 0.15 max_soc = 0.95 + import pdb + + pdb.set_trace() + with subtests.test("SOC never exceeds maximum"): assert np.all(soc <= max_soc + 1e-6) From b7b257344b042a1115f60ca380b505189e817d28 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Tue, 31 Mar 2026 18:09:41 -0600 Subject: [PATCH 08/49] move time series method to a utility function --- .../plm_openloop_storage_controller.py | 18 +------ .../test_plm_openloop_storage_controller.py | 4 -- h2integrate/core/supported_models.py | 4 ++ h2integrate/core/test/test_utilities.py | 53 ++++++++++++++++++- h2integrate/core/utilities.py | 15 ++++++ 5 files changed, 73 insertions(+), 21 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index e8cb10fc6..32b648d89 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -5,7 +5,7 @@ import pandas as pd from attrs import field, define -from h2integrate.core.utilities import merge_shared_inputs +from h2integrate.core.utilities import merge_shared_inputs, build_time_series_from_plant_config from h2integrate.core.validators import contains, gte_zero, range_val, range_val_or_none from h2integrate.control.control_strategies.storage.openloop_storage_control_base import ( StorageOpenLoopControlBase, @@ -88,7 +88,6 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa validator=contains(["demand_profile", "demand_profile_supervisor"]), ) max_supervisor_events: int | None = (field(default=None),) - supervisor_event_period: int | str | None = field(default=None) max_supervisor_event_period: int | str | None = field(default=None) peak_range: dict = field( default={"start": time.min, "end": time.max}, @@ -219,7 +218,7 @@ def setup(self): # Store simulation parameters for later use self.dt = self.options["plant_config"]["plant"]["simulation"]["dt"] - self.time_index = self._build_time_index() + self.time_index = build_time_series_from_plant_config(self.options["plant_config"]) # Build timestamped demand dictionaries from simulation timeline. secondary_demand_profile = self._build_demand_profile_dict(self.config.demand_profile) @@ -254,19 +253,6 @@ def setup(self): self.get_allowed_discharge() - def _build_time_index(self): - """Build a simulation time index from plant configuration. - - Uses `start_time` from simulation config when provided, otherwise defaults to - `2000-01-01 00:00:00`. The resulting index has `n_timesteps` entries and - spacing of `dt` seconds. - """ - simulation_config = self.options["plant_config"]["plant"]["simulation"] - start_time = simulation_config.get("start_time", "2000-01-01 00:00:00") - start_timestamp = pd.to_datetime(start_time) - freq = pd.to_timedelta(int(self.dt), unit="s") - return pd.date_range(start=start_timestamp, periods=self.n_timesteps, freq=freq) - def _build_demand_profile_dict(self, demand_profile): """Convert scalar/list demand input into a timestamped demand dictionary.""" if np.isscalar(demand_profile): diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 1ad247824..61fe81ba7 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -543,10 +543,6 @@ def test_plm_controller_respects_soc_bounds(subtests): min_soc = 0.15 max_soc = 0.95 - import pdb - - pdb.set_trace() - with subtests.test("SOC never exceeds maximum"): assert np.all(soc <= max_soc + 1e-6) diff --git a/h2integrate/core/supported_models.py b/h2integrate/core/supported_models.py index d559b0e05..5ffa262a6 100644 --- a/h2integrate/core/supported_models.py +++ b/h2integrate/core/supported_models.py @@ -161,6 +161,9 @@ from h2integrate.control.control_strategies.storage.simple_openloop_controller import ( SimpleStorageOpenLoopController, ) +from h2integrate.control.control_strategies.storage.plm_openloop_storage_controller import ( + PeakLoadManagementOpenLoopStorageController, +) from h2integrate.control.control_rules.storage.pyomo_storage_rule_min_operating_cost import ( PyomoRuleStorageMinOperatingCosts, ) @@ -282,6 +285,7 @@ # Control "SimpleStorageOpenLoopController": SimpleStorageOpenLoopController, "DemandOpenLoopStorageController": DemandOpenLoopStorageController, + "PeakLoadManagementOpenLoopStorageControllerConfig": PeakLoadManagementOpenLoopStorageController, # noqa: E501 "HeuristicLoadFollowingController": HeuristicLoadFollowingController, "OptimizedDispatchController": OptimizedDispatchController, "DemandOpenLoopConverterController": DemandOpenLoopConverterController, diff --git a/h2integrate/core/test/test_utilities.py b/h2integrate/core/test/test_utilities.py index e7556382d..feb75cf9b 100644 --- a/h2integrate/core/test/test_utilities.py +++ b/h2integrate/core/test/test_utilities.py @@ -4,11 +4,12 @@ import yaml import numpy as np +import pandas as pd import pytest from attrs import field, define from h2integrate import ROOT_DIR, EXAMPLE_DIR, RESOURCE_DEFAULT_DIR -from h2integrate.core.utilities import BaseConfig +from h2integrate.core.utilities import BaseConfig, build_time_series_from_plant_config from h2integrate.core.dict_utils import dict_to_yaml_formatting from h2integrate.core.file_utils import get_path, find_file, load_yaml, make_unique_case_name from h2integrate.core.inputs.validation import load_tech_yaml @@ -547,3 +548,53 @@ def traverse_dict(sample_dict): sample = load_yaml(inputs / fn) traverse_dict(sample) load_tech_yaml(inputs / fn) + + +@pytest.mark.unit +def test_build_time_series_from_plant_config_default_start_time(): + plant_config = { + "plant": { + "simulation": { + "n_timesteps": 4, + "dt": 3600, + } + } + } + + ts = build_time_series_from_plant_config(plant_config) + + expected = pd.to_datetime( + [ + "2000-01-01 00:00:00", + "2000-01-01 01:00:00", + "2000-01-01 02:00:00", + "2000-01-01 03:00:00", + ] + ) + pd.testing.assert_index_equal(ts, pd.DatetimeIndex(expected)) + + +@pytest.mark.unit +def test_build_time_series_from_plant_config_with_start_time(): + plant_config = { + "plant": { + "simulation": { + "n_timesteps": 5, + "dt": 1800, + "start_time": "2025-01-01 06:30:00", + } + } + } + + ts = build_time_series_from_plant_config(plant_config) + + expected = pd.to_datetime( + [ + "2025-01-01 06:30:00", + "2025-01-01 07:00:00", + "2025-01-01 07:30:00", + "2025-01-01 08:00:00", + "2025-01-01 08:30:00", + ] + ) + pd.testing.assert_index_equal(ts, pd.DatetimeIndex(expected)) diff --git a/h2integrate/core/utilities.py b/h2integrate/core/utilities.py index 2a6852f82..fcc2e58fe 100644 --- a/h2integrate/core/utilities.py +++ b/h2integrate/core/utilities.py @@ -3,6 +3,7 @@ import attrs import numpy as np +import pandas as pd from attrs import Attribute, define @@ -191,3 +192,17 @@ def attr_filter(inst: Attribute, value: Any) -> bool: if value.size == 0: return False return True + + +def build_time_series_from_plant_config(plant_config): + """Build simulation timestamps from plant_config simulation settings.""" + simulation_cfg = plant_config["plant"]["simulation"] + n_timesteps = int(simulation_cfg["n_timesteps"]) + dt_seconds = int(simulation_cfg["dt"]) + + # Optional start_time in config; default to a fixed reference timestamp. + start_time = simulation_cfg.get("start_time", "2000-01-01 00:00:00") + start_timestamp = pd.to_datetime(start_time) + freq = pd.to_timedelta(dt_seconds, unit="s") + + return pd.date_range(start=start_timestamp, periods=n_timesteps, freq=freq) From 9b021ee61074e9ea83090c61c480fc5cb4e403ae Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Tue, 31 Mar 2026 19:07:01 -0600 Subject: [PATCH 09/49] wip: add example --- .../33_peak_load_management.yaml | 5 ++ .../demand_profile_secondary.yaml | 8 +++ .../demand_profile_supervisor.yaml | 9 ++++ .../driver_config.yaml | 5 ++ .../33_peak_load_management/plant_config.yaml | 11 ++++ .../run_peak_load_management.py | 45 ++++++++++++++++ .../33_peak_load_management/tech_config.yaml | 54 +++++++++++++++++++ .../plm_openloop_storage_controller.py | 54 ++++++++++++++----- .../test_plm_openloop_storage_controller.py | 34 +++++++++--- h2integrate/core/inputs/validation.py | 14 ++--- h2integrate/core/supported_models.py | 2 +- 11 files changed, 211 insertions(+), 30 deletions(-) create mode 100644 examples/33_peak_load_management/33_peak_load_management.yaml create mode 100644 examples/33_peak_load_management/demand_profile_secondary.yaml create mode 100644 examples/33_peak_load_management/demand_profile_supervisor.yaml create mode 100644 examples/33_peak_load_management/driver_config.yaml create mode 100644 examples/33_peak_load_management/plant_config.yaml create mode 100644 examples/33_peak_load_management/run_peak_load_management.py create mode 100644 examples/33_peak_load_management/tech_config.yaml diff --git a/examples/33_peak_load_management/33_peak_load_management.yaml b/examples/33_peak_load_management/33_peak_load_management.yaml new file mode 100644 index 000000000..3b0321e48 --- /dev/null +++ b/examples/33_peak_load_management/33_peak_load_management.yaml @@ -0,0 +1,5 @@ +name: H2Integrate_config +system_summary: Peak load management dispatch +driver_config: driver_config.yaml +technology_config: tech_config.yaml +plant_config: plant_config.yaml diff --git a/examples/33_peak_load_management/demand_profile_secondary.yaml b/examples/33_peak_load_management/demand_profile_secondary.yaml new file mode 100644 index 000000000..feb0dd1ec --- /dev/null +++ b/examples/33_peak_load_management/demand_profile_secondary.yaml @@ -0,0 +1,8 @@ +- 29 - 27 - 25 - 22 - 20 - 21 - 25 - 31 - 39 - 50 - 66 - 88 - 124 - 152 - 171 - 159 - 141 - 118 - 90 - 72 - 58 - 46 - 37 + - 31 - 30 - 28 - 26 - 24 - 22 - 23 - 27 - 34 - 43 - 57 - 74 - 98 - 132 - 150 - 166 - 173 - 180 - 162 - 134 - 102 - 78 + - 60 - 46 - 35 - 26 - 24 - 22 - 21 - 20 - 22 - 26 - 33 - 41 - 54 - 70 - 94 - 126 - 164 - 158 - 146 - 132 - 110 - 86 - + 68 - 54 - 43 - 35 - 29 - 31 - 29 - 27 - 24 - 22 - 24 - 29 - 36 - 47 - 62 - 80 - 106 - 138 - 152 - 160 - 168 - 172 - 176 + - 148 - 118 - 90 - 70 - 54 - 40 - 27 - 25 - 23 - 21 - 20 - 22 - 27 - 35 - 46 - 60 - 79 - 108 - 169 - 162 - 154 - 146 - + 130 - 112 - 88 - 69 - 55 - 44 - 36 - 30 - 28 - 26 - 24 - 22 - 21 - 23 - 28 - 37 - 49 - 65 - 84 - 112 - 140 - 158 - 170 + - 178 - 166 - 150 - 126 - 98 - 76 - 58 - 44 - 33 - 30 - 28 - 26 - 23 - 21 - 22 - 26 - 32 - 40 - 53 - 69 - 92 - 128 - 156 + - 173 - 165 - 147 - 121 - 93 - 74 - 59 - 47 - 38 - 32 diff --git a/examples/33_peak_load_management/demand_profile_supervisor.yaml b/examples/33_peak_load_management/demand_profile_supervisor.yaml new file mode 100644 index 000000000..60bb27e44 --- /dev/null +++ b/examples/33_peak_load_management/demand_profile_supervisor.yaml @@ -0,0 +1,9 @@ +- 430 - 390 - 360 - 320 - 280 - 250 - 300 - 380 - 520 - 690 - 860 - 1040 - 1260 - 1480 - 1610 - 1520 - 1340 - 1110 - 900 + - 760 - 640 - 560 - 500 - 460 - 380 - 340 - 310 - 280 - 260 - 300 - 420 - 650 - 980 - 1475 - 1380 - 1200 - 980 - 860 - + 790 - 720 - 660 - 610 - 700 - 880 - 1090 - 1030 - 820 - 600 - 450 - 410 - 370 - 330 - 290 - 260 - 310 - 390 - 540 - 710 + - 900 - 1090 - 1310 - 1490 - 1650 - 1730 - 1785 - 1600 - 1320 - 1040 - 820 - 660 - 560 - 490 - 300 - 280 - 250 - 230 - + 220 - 240 - 290 - 360 - 440 - 520 - 610 - 700 - 820 - 910 - 980 - 1020 - 1080 - 1150 - 1230 - 1290 - 1330 - 1360 - 1180 + - 900 - 410 - 380 - 340 - 300 - 270 - 250 - 290 - 360 - 500 - 670 - 860 - 1080 - 1420 - 1695 - 1580 - 1430 - 1270 - 1080 + - 900 - 740 - 620 - 540 - 480 - 430 - 620 - 700 - 860 - 1020 - 1260 - 1450 - 1525 - 1490 - 1320 - 1160 - 980 - 860 - 760 + - 690 - 640 - 610 - 700 - 860 - 1040 - 1230 - 1310 - 1200 - 980 - 760 - 470 - 430 - 390 - 350 - 310 - 280 - 320 - 410 + - 560 - 740 - 930 - 1140 - 1360 - 1550 - 1710 - 1800 - 1680 - 1440 - 1180 - 940 - 760 - 620 - 540 - 480 diff --git a/examples/33_peak_load_management/driver_config.yaml b/examples/33_peak_load_management/driver_config.yaml new file mode 100644 index 000000000..0991d8889 --- /dev/null +++ b/examples/33_peak_load_management/driver_config.yaml @@ -0,0 +1,5 @@ +name: driver_config +description: Driver configuration for multivariable streams example +general: + folder_output: outputs + create_om_reports: false diff --git a/examples/33_peak_load_management/plant_config.yaml b/examples/33_peak_load_management/plant_config.yaml new file mode 100644 index 000000000..8e6303d94 --- /dev/null +++ b/examples/33_peak_load_management/plant_config.yaml @@ -0,0 +1,11 @@ +name: plant_config +description: Demonstrates multivariable streams with a gas combiner +plant: + plant_life: 30 + simulation: + n_timesteps: 168 + dt: 3600 + timezone: -6 + start_time: 2025/07/01 00:00:00 +technology_interconnections: + - [battery, grid, electricity] diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py new file mode 100644 index 000000000..14b10108e --- /dev/null +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -0,0 +1,45 @@ +""" +Example 33: Peak load management dispatch + +This example demonstrates: +1. Peak load management dispatch open loop control +2. Battery charging without an input stream, assuming purchase from the grid + +""" + +import numpy as np +import matplotlib.pyplot as plt + +from h2integrate.core.utilities import build_time_series_from_plant_config +from h2integrate.core.file_utils import load_yaml +from h2integrate.core.h2integrate_model import H2IntegrateModel + + +# Create and setup the H2Integrate model +model = H2IntegrateModel("33_peak_load_management.yaml") + +model.setup() + +# model.run() + +plant_config = load_yaml("plant_config.yaml") +supervisor_demand = np.asarray(load_yaml("demand_profile_supervisor.yaml"), dtype=float) +secondary_demand = np.asarray(load_yaml("demand_profile_secondary.yaml"), dtype=float) + +time_series = build_time_series_from_plant_config(plant_config) + +# Example profiles may be shorter than the simulation horizon; plot over shared length. +n_plot = min(len(time_series), len(supervisor_demand), len(secondary_demand)) +time_plot = time_series[:n_plot] + +fig, ax = plt.subplots(2, 1, sharex=True) + +ax[0].plot(time_plot, supervisor_demand[:n_plot], label="Supervisory demand (MW)") +ax[0].plot(time_plot, secondary_demand[:n_plot], label="Secondary demand (MW)") +ax[0].set_ylabel("Demand (MW)") +ax[0].legend(loc="upper right") + +ax[1].tick_params(axis="x", labelrotation=90) + +plt.tight_layout() +plt.show() diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml new file mode 100644 index 000000000..d6f9af7fd --- /dev/null +++ b/examples/33_peak_load_management/tech_config.yaml @@ -0,0 +1,54 @@ +name: technology_config +description: This plant charges a battery from the grid to reduce peak demand +technologies: + battery: + performance_model: + model: StoragePerformanceModel + cost_model: + model: ATBBatteryCostModel + control_strategy: + model: PeakLoadManagementOpenLoopStorageController + model_inputs: + shared_parameters: + commodity: electricity + commodity_rate_units: kW + max_charge_rate: 2500.0 # kW/time step, 1, 2.5, or 5 MW + max_capacity: 10000.0 # kWh, 80 MWh + max_soc_fraction: 0.9 # percent as decimal + min_soc_fraction: 0.1 # percent as decimal + init_soc_fraction: 0.9 # percent as decimal + demand_profile: !include demand_profile_secondary.yaml + charge_efficiency: 1.0 # percent as decimal + discharge_efficiency: 1.0 # percent as decimal + control_parameters: + max_discharge_rate: 2500.0 # kW/time step + charge_equals_discharge: true + demand_profile_supervisor: !include demand_profile_supervisor.yaml + dispatch_priority_demand_profile: demand_profile_supervisor + max_supervisor_events: 2 + max_supervisor_event_period: w + peak_range: + start: 17:00:00 + end: 12:00:00 + advance_discharge_period: + units: h + val: 2 + delay_charge_period: + units: h + val: 4 + allow_charge_in_peak_range: false + cost_parameters: + cost_year: 2024 + energy_capex: 408 # $/kWh # conservative case for 2024 ATB utility scale batteries + power_capex: 379 # $/kW # conservative case for 2024 ATB utility scale batteries + opex_fraction: 0.025 # 2.5% percent of capex as per 2024 ATB for utility scale batteries + grid_buy: + performance_model: + model: GridPerformanceModel + cost_model: + model: GridCostModel + model_inputs: + performance_parameters: + interconnection_size: 100000 + cost_parameters: + cost_year: 2024 diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 32b648d89..f98aff912 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -1,5 +1,5 @@ from copy import deepcopy -from datetime import time +from datetime import datetime import numpy as np import pandas as pd @@ -81,7 +81,6 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - demand_profile: int | float | list = field() demand_profile_supervisor: int | float | list | None = field(default=None) dispatch_priority_demand_profile: str = field( default="demand_profile_supervisor", @@ -90,10 +89,10 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa max_supervisor_events: int | None = (field(default=None),) max_supervisor_event_period: int | str | None = field(default=None) peak_range: dict = field( - default={"start": time.min, "end": time.max}, + default={"start": "00:00:00", "end": "23:59:59"}, metadata={ "description": "Daily time window for peak detection. " - "Dict with 'start' and 'end' as datetime.time objects." + "Dict with 'start' and 'end' as HH:MM:SS strings." }, ) advance_discharge_period: dict = field( @@ -191,6 +190,9 @@ def setup(self): ) super().setup() + import pdb + + pdb.set_trace() self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] # Register storage system design constraint inputs @@ -239,6 +241,9 @@ def setup(self): # Detect daily peaks in secondary demand profile (always computed) # Respects the configured peak_range time window for each day + import pdb + + pdb.set_trace() self.secondary_peaks_df = self.get_peaks( demand_profile=secondary_demand_profile, peak_range=self.config.peak_range, @@ -271,6 +276,29 @@ def _build_demand_profile_dict(self, demand_profile): "demand": demand_values, } + @staticmethod + def _normalize_peak_range(peak_range): + """Validate and parse peak_range values from HH:MM:SS strings. + + Returns a dict with datetime.time objects. + """ + if not isinstance(peak_range, dict): + raise ValueError("peak_range must be a dict with keys 'start' and 'end'") + if "start" not in peak_range or "end" not in peak_range: + raise ValueError("peak_range must be a dict with keys 'start' and 'end'") + + parsed = {} + for key in ["start", "end"]: + value = peak_range[key] + if not isinstance(value, str): + raise ValueError(f"peak_range['{key}'] must be an HH:MM:SS string") + try: + parsed[key] = datetime.strptime(value, "%H:%M:%S").time() + except ValueError as exc: + raise ValueError(f"peak_range['{key}'] must be an HH:MM:SS string") from exc + + return parsed + def compute(self, inputs, outputs): """ Compute storage state of charge (SOC), delivered output, curtailment, and unmet @@ -443,7 +471,7 @@ def get_peaks( n_max_events=None, max_events_period=None, min_proximity=None, - peak_range={"start": time.min, "end": time.max}, + peak_range={"start": "00:00:00", "end": "23:59:59"}, ): """Detect demand peaks using configurable time windows and event limits. @@ -468,9 +496,9 @@ def get_peaks( Example: {'units': 'D', 'val': 1} enforces 1-day minimum gap. Raises ValueError if violated. Defaults to None (no constraint). peak_range (dict, optional): Daily time window for peak detection. Dict with keys: - - 'start': datetime.time object (inclusive) - - 'end': datetime.time object (inclusive) - Defaults to full day (time.min to time.max). + - 'start': HH:MM:SS string (inclusive) + - 'end': HH:MM:SS string (exclusive) + Defaults to full day. Returns: pd.DataFrame: Input demand_profile with added 'is_peak' boolean column. @@ -483,6 +511,8 @@ def get_peaks( if not isinstance(demand_profile, dict): raise ValueError("demand_profile must be a dict with 'date_time' and 'demand' keys") + peak_range = PeakLoadManagementOpenLoopStorageController._normalize_peak_range(peak_range) + demand_df = pd.DataFrame(demand_profile) if "date_time" not in demand_df or "demand" not in demand_df: raise ValueError("demand_profile must include 'date_time' and 'demand' keys") @@ -492,8 +522,6 @@ def get_peaks( demand_df["period_day"] = demand_df["date_time"].dt.floor("D") # Validate and apply time-of-day window - if not isinstance(peak_range["start"], time) or not isinstance(peak_range["end"], time): - raise ValueError("peak_range['start'] and peak_range['end'] must be datetime.time") time_of_day = demand_df["date_time"].dt.time if peak_range["start"] <= peak_range["end"]: # Normal window: 12:00-17:00 @@ -669,13 +697,11 @@ def get_allowed_discharge(self): # Global allow: charging always permitted self.peaks_df["allow_charge"] = True else: + peak_range = self._normalize_peak_range(self.config.peak_range) # Selective allow: suppress charging during peak window only self.peaks_df["allow_charge"] = False for i in range(self.n_timesteps): time_of_day = self.peaks_df["date_time"].iloc[i].time() # Allow charging if outside peak window - if ( - time_of_day < self.config.peak_range["start"] - or time_of_day >= self.config.peak_range["end"] - ): + if time_of_day < peak_range["start"] or time_of_day >= peak_range["end"]: self.peaks_df["allow_charge"].iloc[i] = True diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 61fe81ba7..2da0f8f02 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -1,6 +1,5 @@ from types import SimpleNamespace from pathlib import Path -from datetime import time import numpy as np import pandas as pd @@ -14,6 +13,9 @@ ) +# from datetime import time + + def _controller_without_setup(): """Create a controller instance for testing pure helper methods.""" return object.__new__(PeakLoadManagementOpenLoopStorageController) @@ -156,7 +158,7 @@ def test_get_peaks_respects_peak_range_12pm_to_5pm(): peaks = controller.get_peaks( demand_profile, - peak_range={"start": time(12, 0), "end": time(17, 0)}, + peak_range={"start": "12:00:00", "end": "17:00:00"}, ) actual_peak_times = peaks.loc[peaks["is_peak"], "date_time"].tolist() @@ -168,6 +170,22 @@ def test_get_peaks_respects_peak_range_12pm_to_5pm(): assert actual_peak_times == expected_peak_times +@pytest.mark.unit +def test_get_peaks_rejects_non_string_peak_range_values(): + controller = _controller_without_setup() + + demand_profile = { + "date_time": pd.date_range("2025-01-01", periods=4, freq="6h"), + "demand": [1.0, 9.0, 3.0, 2.0], + } + + with pytest.raises(ValueError, match="HH:MM:SS string"): + controller.get_peaks( + demand_profile, + peak_range={"start": pd.Timestamp("2025-01-01 12:00:00").time(), "end": "17:00:00"}, + ) + + @pytest.mark.unit def test_get_peaks_invalid_min_proximity_raises(): controller = _controller_without_setup() @@ -339,7 +357,7 @@ def test_get_allowed_discharge_always_true_when_charge_allowed_in_peak_range(): """When allow_charge_in_peak_range=True every row should allow charging.""" controller = _make_controller_with_config( allow_charge_in_peak_range=True, - peak_range={"start": time(12, 0), "end": time(17, 0)}, + peak_range={"start": "12:00:00", "end": "17:00:00"}, ) controller.peaks_df = pd.DataFrame( { @@ -366,7 +384,7 @@ def test_get_allowed_discharge_blocks_charge_inside_peak_range(subtests): """When allow_charge_in_peak_range=False, rows inside the window get allow_charge=False.""" controller = _make_controller_with_config( allow_charge_in_peak_range=False, - peak_range={"start": time(12, 0), "end": time(17, 0)}, + peak_range={"start": "12:00:00", "end": "17:00:00"}, ) controller.peaks_df = pd.DataFrame( { @@ -419,7 +437,7 @@ def test_plm_controller_basic_discharge_before_peak(subtests): "charge_efficiency": 0.95, "discharge_efficiency": 0.95, "demand_profile": [10.0] * 10 + [50.0] * 4 + [10.0] * 10, # Peak at hours 10-14 - "peak_range": {"start": time(10, 0), "end": time(14, 0)}, + "peak_range": {"start": "10:00:00", "end": "14:00:00"}, "advance_discharge_period": {"units": "h", "val": 2}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": False, @@ -500,7 +518,7 @@ def test_plm_controller_respects_soc_bounds(subtests): "charge_efficiency": 0.9, "discharge_efficiency": 0.9, "demand_profile": [5.0] * 12, - "peak_range": {"start": time(6, 0), "end": time(9, 0)}, + "peak_range": {"start": "06:00:00", "end": "09:00:00"}, "advance_discharge_period": {"units": "h", "val": 1}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": True, @@ -557,8 +575,8 @@ def test_plm_controller_blocking_charge_in_peak_range(subtests): tech_config_path = current_dir / "inputs" / "tech_config.yaml" tech_config = load_yaml(tech_config_path) - peak_window_start = time(10, 0) - peak_window_end = time(14, 0) + peak_window_start = "10:00:00" + peak_window_end = "14:00:00" tech_config["technologies"]["h2_storage"]["model_inputs"]["shared_parameters"] = { "commodity": "hydrogen", diff --git a/h2integrate/core/inputs/validation.py b/h2integrate/core/inputs/validation.py index d9cc6f90d..70083045c 100644 --- a/h2integrate/core/inputs/validation.py +++ b/h2integrate/core/inputs/validation.py @@ -140,13 +140,13 @@ def load_tech_yaml(finput): def load_plant_yaml(finput): plant_config = _validate(finput, fschema_plant) - if int(plant_config["plant"]["simulation"]["n_timesteps"]) != 8760: - msg = ( - "H2Integrate does not currently support simulations that are less than or " - "greater than 1-year. Please ensure that " - "plant_config['plant']['simulation']['n_timesteps'] is set to 8760." - ) - raise ValueError(msg) + # if int(plant_config["plant"]["simulation"]["n_timesteps"]) != 8760: + # msg = ( + # "H2Integrate does not currently support simulations that are less than or " + # "greater than 1-year. Please ensure that " + # "plant_config['plant']['simulation']['n_timesteps'] is set to 8760." + # ) + # raise ValueError(msg) if int(plant_config["plant"]["simulation"]["dt"]) != 3600: msg = ( "H2Integrate does not currently support simulations with a time step that is " diff --git a/h2integrate/core/supported_models.py b/h2integrate/core/supported_models.py index 5ffa262a6..ccef994ba 100644 --- a/h2integrate/core/supported_models.py +++ b/h2integrate/core/supported_models.py @@ -285,7 +285,7 @@ # Control "SimpleStorageOpenLoopController": SimpleStorageOpenLoopController, "DemandOpenLoopStorageController": DemandOpenLoopStorageController, - "PeakLoadManagementOpenLoopStorageControllerConfig": PeakLoadManagementOpenLoopStorageController, # noqa: E501 + "PeakLoadManagementOpenLoopStorageController": PeakLoadManagementOpenLoopStorageController, "HeuristicLoadFollowingController": HeuristicLoadFollowingController, "OptimizedDispatchController": OptimizedDispatchController, "DemandOpenLoopConverterController": DemandOpenLoopConverterController, From b4508be56ffba5ae0fa10d7587b6c862e6b91355 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 1 Apr 2026 11:20:12 -0600 Subject: [PATCH 10/49] remove debug statements --- .../storage/plm_openloop_storage_controller.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index f98aff912..1fa0d362e 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -190,9 +190,6 @@ def setup(self): ) super().setup() - import pdb - - pdb.set_trace() self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] # Register storage system design constraint inputs @@ -241,9 +238,6 @@ def setup(self): # Detect daily peaks in secondary demand profile (always computed) # Respects the configured peak_range time window for each day - import pdb - - pdb.set_trace() self.secondary_peaks_df = self.get_peaks( demand_profile=secondary_demand_profile, peak_range=self.config.peak_range, From 4473244b3902eed83881edd9ac931c8b96a75a90 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 1 Apr 2026 12:08:20 -0600 Subject: [PATCH 11/49] remove defaults and add input of min_proximity --- .../plm_openloop_storage_controller.py | 34 ++++++++++++++----- .../test_plm_openloop_storage_controller.py | 11 +++++- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 1fa0d362e..6e18d0c50 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -81,29 +81,25 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - demand_profile_supervisor: int | float | list | None = field(default=None) + demand_profile_supervisor: int | float | list | None = field() dispatch_priority_demand_profile: str = field( - default="demand_profile_supervisor", validator=contains(["demand_profile", "demand_profile_supervisor"]), ) max_supervisor_events: int | None = (field(default=None),) max_supervisor_event_period: int | str | None = field(default=None) peak_range: dict = field( - default={"start": "00:00:00", "end": "23:59:59"}, metadata={ "description": "Daily time window for peak detection. " "Dict with 'start' and 'end' as HH:MM:SS strings." }, ) advance_discharge_period: dict = field( - default={"units": "H", "val": 2}, metadata={ "description": "How long before a peak to start discharging. " "Dict with 'units' (timedelta unit str) and 'val' (numeric)." }, ) delay_charge_period: dict = field( - default={"units": "H", "val": 4}, metadata={ "description": "Minimum delay after discharge completes before charging resumes. " "Dict with 'units' and 'val'." @@ -113,6 +109,13 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa default=True, metadata={"description": "If False, charging is suppressed during peak_range."}, ) + min_peak_proximity: dict = field( + metadata={ + "description": "Minimum time allowed between peak events. An error is raised if " + "peak events do not respect the given time separation." + "Dict with 'units' and 'val'." + }, + ) def __attrs_post_init__(self): """ @@ -190,6 +193,17 @@ def setup(self): ) super().setup() + if ( + self.config.demand_profile_supervisor is None + and self.config.dispatch_priority_demand_profile == "demand_profile_supervisor" + ): + raise ( + ValueError( + "If demand_profile_supervisor is None, then dispatch_priority_demand_profile" + "must be demand_profile" + ) + ) + self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] # Register storage system design constraint inputs @@ -231,7 +245,7 @@ def setup(self): demand_profile=supervisor_demand_profile, n_max_events=self.config.max_supervisor_events, max_events_period=self.config.max_supervisor_event_period, - min_proximity={"units": "H", "val": 4}, + min_proximity=self.config.min_peak_proximity, ) else: self.supervisor_peaks_df = None @@ -626,7 +640,7 @@ def merge_peaks(supervisory_peaks_df, secondary_peaks_df): Args: supervisory_peaks_df (pd.DataFrame | None): Primary peak schedule with columns - ['date_time', 'is_peak', 'demand', ...]. If None, secondary peaks are used. + ['date_time', 'is_peak', 'demand', ...]. secondary_peaks_df (pd.DataFrame): Secondary/fallback peak schedule with same columns. Returns: @@ -634,8 +648,10 @@ def merge_peaks(supervisory_peaks_df, secondary_peaks_df): Otherwise, returns secondary with 'is_peak' flags overridden on supervisor-peak days. """ - peaks_df = secondary_peaks_df.copy() - if supervisory_peaks_df is not None: + if secondary_peaks_df is None: + peaks_df = supervisory_peaks_df.copy() + else: + peaks_df = secondary_peaks_df.copy() # For each day in the data, check if supervisor has any peaks for day in secondary_peaks_df["date_time"].dt.floor("D").unique(): day_df = supervisory_peaks_df[ diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 2da0f8f02..2c59ae3ef 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -221,7 +221,7 @@ def test_merge_peaks_without_supervisor_returns_secondary_flags(subtests): } ) - merged = PeakLoadManagementOpenLoopStorageController.merge_peaks(None, secondary_peaks_df) + merged = PeakLoadManagementOpenLoopStorageController.merge_peaks(secondary_peaks_df, None) with subtests.test("peak flags unchanged"): assert merged["is_peak"].tolist() == secondary_peaks_df["is_peak"].tolist() @@ -441,6 +441,9 @@ def test_plm_controller_basic_discharge_before_peak(subtests): "advance_discharge_period": {"units": "h", "val": 2}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": False, + "demand_profile_supervisor": None, + "dispatch_priority_demand_profile": "demand_profile", + "min_peak_proximity": {"units": "h", "val": 4}, } tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( @@ -522,6 +525,9 @@ def test_plm_controller_respects_soc_bounds(subtests): "advance_discharge_period": {"units": "h", "val": 1}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": True, + "demand_profile_supervisor": None, + "dispatch_priority_demand_profile": "demand_profile", + "min_peak_proximity": {"units": "h", "val": 4}, } tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( @@ -591,10 +597,13 @@ def test_plm_controller_blocking_charge_in_peak_range(subtests): "charge_efficiency": 0.92, "discharge_efficiency": 0.92, "demand_profile": [5.0] * 24, + "demand_profile_supervisor": None, "peak_range": {"start": peak_window_start, "end": peak_window_end}, "advance_discharge_period": {"units": "h", "val": 3}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": False, # Block charging in peak window + "dispatch_priority_demand_profile": "demand_profile", + "min_peak_proximity": {"units": "h", "val": 4}, } tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( From 4b6e25f1d3f52885058485dc43f4869960c29059 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 2 Apr 2026 08:53:18 -0600 Subject: [PATCH 12/49] exclude example 33 demand profile yamls from yamlfix --- .pre-commit-config.yaml | 2 +- .../demand_profile_secondary.yaml | 8 ---- .../demand_profile_supervisor.yaml | 9 ----- .../run_peak_load_management.py | 8 +++- .../33_peak_load_management/tech_config.yaml | 18 ++++++--- .../plm_openloop_storage_controller.py | 40 +++++++++++-------- 6 files changed, 44 insertions(+), 41 deletions(-) delete mode 100644 examples/33_peak_load_management/demand_profile_secondary.yaml delete mode 100644 examples/33_peak_load_management/demand_profile_supervisor.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e8d0ef24f..a4a36609c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,7 +27,7 @@ repos: - id: yamlfix # Exclude YAML files that are used as inputs for testing or examples, or ones for desired schedule in HOPP as they # expect misformatted YAML files. - exclude: ^(h2integrate/core/test/inputs/.*|examples/11_hybrid_energy_plant/tech_inputs/desired_schedules/.*)$ + exclude: ^(h2integrate/core/test/inputs/.*|examples/11_hybrid_energy_plant/tech_inputs/desired_schedules/.*|examples/33_hybrid_energy_plant/demand_profiles/.*)$ - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. rev: v0.8.1 diff --git a/examples/33_peak_load_management/demand_profile_secondary.yaml b/examples/33_peak_load_management/demand_profile_secondary.yaml deleted file mode 100644 index feb0dd1ec..000000000 --- a/examples/33_peak_load_management/demand_profile_secondary.yaml +++ /dev/null @@ -1,8 +0,0 @@ -- 29 - 27 - 25 - 22 - 20 - 21 - 25 - 31 - 39 - 50 - 66 - 88 - 124 - 152 - 171 - 159 - 141 - 118 - 90 - 72 - 58 - 46 - 37 - - 31 - 30 - 28 - 26 - 24 - 22 - 23 - 27 - 34 - 43 - 57 - 74 - 98 - 132 - 150 - 166 - 173 - 180 - 162 - 134 - 102 - 78 - - 60 - 46 - 35 - 26 - 24 - 22 - 21 - 20 - 22 - 26 - 33 - 41 - 54 - 70 - 94 - 126 - 164 - 158 - 146 - 132 - 110 - 86 - - 68 - 54 - 43 - 35 - 29 - 31 - 29 - 27 - 24 - 22 - 24 - 29 - 36 - 47 - 62 - 80 - 106 - 138 - 152 - 160 - 168 - 172 - 176 - - 148 - 118 - 90 - 70 - 54 - 40 - 27 - 25 - 23 - 21 - 20 - 22 - 27 - 35 - 46 - 60 - 79 - 108 - 169 - 162 - 154 - 146 - - 130 - 112 - 88 - 69 - 55 - 44 - 36 - 30 - 28 - 26 - 24 - 22 - 21 - 23 - 28 - 37 - 49 - 65 - 84 - 112 - 140 - 158 - 170 - - 178 - 166 - 150 - 126 - 98 - 76 - 58 - 44 - 33 - 30 - 28 - 26 - 23 - 21 - 22 - 26 - 32 - 40 - 53 - 69 - 92 - 128 - 156 - - 173 - 165 - 147 - 121 - 93 - 74 - 59 - 47 - 38 - 32 diff --git a/examples/33_peak_load_management/demand_profile_supervisor.yaml b/examples/33_peak_load_management/demand_profile_supervisor.yaml deleted file mode 100644 index 60bb27e44..000000000 --- a/examples/33_peak_load_management/demand_profile_supervisor.yaml +++ /dev/null @@ -1,9 +0,0 @@ -- 430 - 390 - 360 - 320 - 280 - 250 - 300 - 380 - 520 - 690 - 860 - 1040 - 1260 - 1480 - 1610 - 1520 - 1340 - 1110 - 900 - - 760 - 640 - 560 - 500 - 460 - 380 - 340 - 310 - 280 - 260 - 300 - 420 - 650 - 980 - 1475 - 1380 - 1200 - 980 - 860 - - 790 - 720 - 660 - 610 - 700 - 880 - 1090 - 1030 - 820 - 600 - 450 - 410 - 370 - 330 - 290 - 260 - 310 - 390 - 540 - 710 - - 900 - 1090 - 1310 - 1490 - 1650 - 1730 - 1785 - 1600 - 1320 - 1040 - 820 - 660 - 560 - 490 - 300 - 280 - 250 - 230 - - 220 - 240 - 290 - 360 - 440 - 520 - 610 - 700 - 820 - 910 - 980 - 1020 - 1080 - 1150 - 1230 - 1290 - 1330 - 1360 - 1180 - - 900 - 410 - 380 - 340 - 300 - 270 - 250 - 290 - 360 - 500 - 670 - 860 - 1080 - 1420 - 1695 - 1580 - 1430 - 1270 - 1080 - - 900 - 740 - 620 - 540 - 480 - 430 - 620 - 700 - 860 - 1020 - 1260 - 1450 - 1525 - 1490 - 1320 - 1160 - 980 - 860 - 760 - - 690 - 640 - 610 - 700 - 860 - 1040 - 1230 - 1310 - 1200 - 980 - 760 - 470 - 430 - 390 - 350 - 310 - 280 - 320 - 410 - - 560 - 740 - 930 - 1140 - 1360 - 1550 - 1710 - 1800 - 1680 - 1440 - 1180 - 940 - 760 - 620 - 540 - 480 diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index 14b10108e..ea401b5c1 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -23,8 +23,12 @@ # model.run() plant_config = load_yaml("plant_config.yaml") -supervisor_demand = np.asarray(load_yaml("demand_profile_supervisor.yaml"), dtype=float) -secondary_demand = np.asarray(load_yaml("demand_profile_secondary.yaml"), dtype=float) +supervisor_demand = np.asarray( + load_yaml("demand_profiles/demand_profile_supervisor.yaml"), dtype=float +) +secondary_demand = np.asarray( + load_yaml("demand_profiles/demand_profile_secondary.yaml"), dtype=float +) time_series = build_time_series_from_plant_config(plant_config) diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index d6f9af7fd..1cd104212 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -17,19 +17,19 @@ technologies: max_soc_fraction: 0.9 # percent as decimal min_soc_fraction: 0.1 # percent as decimal init_soc_fraction: 0.9 # percent as decimal - demand_profile: !include demand_profile_secondary.yaml + demand_profile: !include demand_profiles/demand_profile_secondary.yaml charge_efficiency: 1.0 # percent as decimal discharge_efficiency: 1.0 # percent as decimal control_parameters: max_discharge_rate: 2500.0 # kW/time step charge_equals_discharge: true - demand_profile_supervisor: !include demand_profile_supervisor.yaml + demand_profile_supervisor: !include demand_profiles/demand_profile_supervisor.yaml dispatch_priority_demand_profile: demand_profile_supervisor max_supervisor_events: 2 - max_supervisor_event_period: w + max_supervisor_event_period: W peak_range: - start: 17:00:00 - end: 12:00:00 + start: 12:00:00 + end: 17:00:00 advance_discharge_period: units: h val: 2 @@ -37,6 +37,9 @@ technologies: units: h val: 4 allow_charge_in_peak_range: false + min_peak_proximity: + units: h + val: 4 cost_parameters: cost_year: 2024 energy_capex: 408 # $/kWh # conservative case for 2024 ATB utility scale batteries @@ -52,3 +55,8 @@ technologies: interconnection_size: 100000 cost_parameters: cost_year: 2024 + fixed_interconnection_cost: 0.0 + interconnection_capex_per_kw: 0.0 + interconnection_opex_per_kw: 0.0 + interconnection_size: 0.0 + electricity_buy_price: 0.09 diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 6e18d0c50..00f15d1ff 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -1,5 +1,5 @@ from copy import deepcopy -from datetime import datetime +from datetime import datetime, timedelta import numpy as np import pandas as pd @@ -155,6 +155,12 @@ def __attrs_post_init__(self): self.max_discharge_rate = self.max_charge_rate + # make sure peak_range is in correct format because yaml + # automatically converts it to seconds + for key, value in self.peak_range.items(): + if not isinstance(value, str): + self.peak_range[key] = str(timedelta(seconds=value)) + class PeakLoadManagementOpenLoopStorageController(StorageOpenLoopControlBase): """ @@ -234,12 +240,16 @@ def setup(self): self.time_index = build_time_series_from_plant_config(self.options["plant_config"]) # Build timestamped demand dictionaries from simulation timeline. - secondary_demand_profile = self._build_demand_profile_dict(self.config.demand_profile) + secondary_demand_profile = self._build_demand_profile_dict( + self.config.demand_profile, + self.time_index, + ) # Detect peaks in supervisor demand profile (if provided) if self.config.demand_profile_supervisor is not None: supervisor_demand_profile = self._build_demand_profile_dict( - self.config.demand_profile_supervisor + self.config.demand_profile_supervisor, + self.time_index, ) self.supervisor_peaks_df = self.get_peaks( demand_profile=supervisor_demand_profile, @@ -266,21 +276,23 @@ def setup(self): self.get_allowed_discharge() - def _build_demand_profile_dict(self, demand_profile): + @staticmethod + def _build_demand_profile_dict(demand_profile, time_series): """Convert scalar/list demand input into a timestamped demand dictionary.""" + n_timesteps = len(time_series) if np.isscalar(demand_profile): - demand_values = np.full(self.n_timesteps, float(demand_profile), dtype=float) + demand_values = np.full(n_timesteps, float(demand_profile), dtype=float) else: demand_values = np.asarray(demand_profile, dtype=float) - if len(demand_values) != self.n_timesteps: + if len(demand_values) != n_timesteps: raise ValueError( "demand_profile length must equal n_timesteps " - f"({len(demand_values)} != {self.n_timesteps})" + f"({len(demand_values)} != {n_timesteps})" ) return { - "date_time": self.time_index, + "date_time": time_series, "demand": demand_values, } @@ -296,14 +308,10 @@ def _normalize_peak_range(peak_range): raise ValueError("peak_range must be a dict with keys 'start' and 'end'") parsed = {} - for key in ["start", "end"]: - value = peak_range[key] + for key, value in peak_range.items(): if not isinstance(value, str): raise ValueError(f"peak_range['{key}'] must be an HH:MM:SS string") - try: - parsed[key] = datetime.strptime(value, "%H:%M:%S").time() - except ValueError as exc: - raise ValueError(f"peak_range['{key}'] must be an HH:MM:SS string") from exc + parsed[key] = datetime.strptime(value, "%H:%M:%S").time() return parsed @@ -659,7 +667,7 @@ def merge_peaks(supervisory_peaks_df, secondary_peaks_df): ] # If supervisor has peaks on the day, use supervisor's flags for all rows that day if any(day_df["is_peak"]): - peaks_df["is_peak"][peaks_df["date_time"].dt.floor("D") == day] = day_df[ + peaks_df.loc[peaks_df["date_time"].dt.floor("D") == day, "is_peak"] = day_df[ "is_peak" ] @@ -714,4 +722,4 @@ def get_allowed_discharge(self): time_of_day = self.peaks_df["date_time"].iloc[i].time() # Allow charging if outside peak window if time_of_day < peak_range["start"] or time_of_day >= peak_range["end"]: - self.peaks_df["allow_charge"].iloc[i] = True + self.peaks_df.loc[i, "allow_charge"] = True From d7774d24f586ba13ad786175b03543b4b28db1bc Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 2 Apr 2026 10:10:15 -0600 Subject: [PATCH 13/49] example runs --- examples/33_peak_load_management/plant_config.yaml | 2 +- examples/33_peak_load_management/run_peak_load_management.py | 2 +- examples/33_peak_load_management/tech_config.yaml | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/33_peak_load_management/plant_config.yaml b/examples/33_peak_load_management/plant_config.yaml index 8e6303d94..95462eef5 100644 --- a/examples/33_peak_load_management/plant_config.yaml +++ b/examples/33_peak_load_management/plant_config.yaml @@ -8,4 +8,4 @@ plant: timezone: -6 start_time: 2025/07/01 00:00:00 technology_interconnections: - - [battery, grid, electricity] + - [battery, grid_buy, [electricity_out, electricity_in]] diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index ea401b5c1..6b558cae0 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -20,7 +20,7 @@ model.setup() -# model.run() +model.run() plant_config = load_yaml("plant_config.yaml") supervisor_demand = np.asarray( diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index 1cd104212..09164a883 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -51,12 +51,11 @@ technologies: cost_model: model: GridCostModel model_inputs: - performance_parameters: + shared_parameters: interconnection_size: 100000 cost_parameters: cost_year: 2024 fixed_interconnection_cost: 0.0 interconnection_capex_per_kw: 0.0 interconnection_opex_per_kw: 0.0 - interconnection_size: 0.0 electricity_buy_price: 0.09 From 74fc2edca1ee6eb7a178715209f85a546c54c5a7 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 2 Apr 2026 11:38:47 -0600 Subject: [PATCH 14/49] example complete --- .../run_peak_load_management.py | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index 6b558cae0..a91c80122 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -36,14 +36,37 @@ n_plot = min(len(time_series), len(supervisor_demand), len(secondary_demand)) time_plot = time_series[:n_plot] -fig, ax = plt.subplots(2, 1, sharex=True) +fig, ax = plt.subplots(4, 1, sharex=True) -ax[0].plot(time_plot, supervisor_demand[:n_plot], label="Supervisory demand (MW)") -ax[0].plot(time_plot, secondary_demand[:n_plot], label="Secondary demand (MW)") -ax[0].set_ylabel("Demand (MW)") +ax[0].plot(time_plot, supervisor_demand[:n_plot] * 1e-3, label="Supervisory demand (MW)") +ax[0].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Secondary demand (MW)") +ax[0].set_ylabel("Power (MW)") ax[0].legend(loc="upper right") -ax[1].tick_params(axis="x", labelrotation=90) +ax[1].plot(time_plot, model.prob.get_val("battery.SOC", units="percent")) +ax[1].set(ylabel="SOC") +ax[2].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") +ax[2].plot( + time_plot, + model.prob.get_val("battery.electricity_out", units="MW"), + label="Battery charge/discharge", +) +ax[2].set(ylabel="Power (MW)") +ax[2].legend() + +ax[3].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") +ax[3].plot( + time_plot, + model.prob.get_val("battery.unmet_electricity_demand_out", units="MW"), + label="New demand profile", +) +ax[3].set(ylabel="Power (MW)") +ax[3].legend() + + +ax[3].tick_params(axis="x", labelrotation=90) + +# import pdb; pdb.set_trace() plt.tight_layout() plt.show() From b456d7593d2630f1b9119b561e499795ec98babf Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 2 Apr 2026 12:27:45 -0600 Subject: [PATCH 15/49] remove n_timesteps since it comes from base class --- .../storage/plm_openloop_storage_controller.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 00f15d1ff..1e00acc2b 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -210,8 +210,6 @@ def setup(self): ) ) - self.n_timesteps = self.options["plant_config"]["plant"]["simulation"]["n_timesteps"] - # Register storage system design constraint inputs self.add_input( "max_charge_rate", From a624bd48192d7dce293d8bc793319b15daf0a524 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 2 Apr 2026 12:31:13 -0600 Subject: [PATCH 16/49] remove erroneous changes to example 32 --- examples/32_multivariable_streams/driver_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/32_multivariable_streams/driver_config.yaml b/examples/32_multivariable_streams/driver_config.yaml index 801fe95fe..0991d8889 100644 --- a/examples/32_multivariable_streams/driver_config.yaml +++ b/examples/32_multivariable_streams/driver_config.yaml @@ -1,5 +1,5 @@ name: driver_config -description: Driver configuration for peak load management example +description: Driver configuration for multivariable streams example general: folder_output: outputs create_om_reports: false From 7b3d3da077e2d8d4e3d4069bef35904b68f99270 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 8 Apr 2026 15:17:03 -0600 Subject: [PATCH 17/49] add doc strings, input checks, time series function updates, test updates, default time zone and other changes for PR feedback --- .../run_peak_load_management.py | 25 +++--- .../33_peak_load_management/tech_config.yaml | 32 ++++---- .../plm_openloop_storage_controller.py | 78 ++++++++++++++++--- .../test_plm_openloop_storage_controller.py | 44 +++++++++-- h2integrate/core/inputs/plant_schema.yaml | 1 + h2integrate/core/test/test_utilities.py | 44 +++-------- h2integrate/core/utilities.py | 19 ++++- 7 files changed, 159 insertions(+), 84 deletions(-) diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index a91c80122..a974079fe 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -11,7 +11,6 @@ import matplotlib.pyplot as plt from h2integrate.core.utilities import build_time_series_from_plant_config -from h2integrate.core.file_utils import load_yaml from h2integrate.core.h2integrate_model import H2IntegrateModel @@ -22,28 +21,25 @@ model.run() -plant_config = load_yaml("plant_config.yaml") -supervisor_demand = np.asarray( - load_yaml("demand_profiles/demand_profile_supervisor.yaml"), dtype=float -) -secondary_demand = np.asarray( - load_yaml("demand_profiles/demand_profile_secondary.yaml"), dtype=float +supervisor_demand = np.array( + model.technology_config["technologies"]["battery"]["model_inputs"]["control_parameters"][ + "demand_profile_supervisor" + ] ) +secondary_demand = model.prob.get_val("battery.electricity_demand") -time_series = build_time_series_from_plant_config(plant_config) +time_series = build_time_series_from_plant_config(model.plant_config) -# Example profiles may be shorter than the simulation horizon; plot over shared length. -n_plot = min(len(time_series), len(supervisor_demand), len(secondary_demand)) +n_plot = 24 * 7 time_plot = time_series[:n_plot] fig, ax = plt.subplots(4, 1, sharex=True) - ax[0].plot(time_plot, supervisor_demand[:n_plot] * 1e-3, label="Supervisory demand (MW)") ax[0].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Secondary demand (MW)") ax[0].set_ylabel("Power (MW)") ax[0].legend(loc="upper right") -ax[1].plot(time_plot, model.prob.get_val("battery.SOC", units="percent")) +ax[1].plot(time_plot, model.prob.get_val("battery.SOC", units="percent")[:n_plot]) ax[1].set(ylabel="SOC") ax[2].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") @@ -58,15 +54,12 @@ ax[3].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[3].plot( time_plot, - model.prob.get_val("battery.unmet_electricity_demand_out", units="MW"), + model.prob.get_val("battery.unmet_electricity_demand_out", units="MW")[:n_plot], label="New demand profile", ) ax[3].set(ylabel="Power (MW)") ax[3].legend() - - ax[3].tick_params(axis="x", labelrotation=90) -# import pdb; pdb.set_trace() plt.tight_layout() plt.show() diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index 09164a883..a913ed38e 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -13,7 +13,7 @@ technologies: commodity: electricity commodity_rate_units: kW max_charge_rate: 2500.0 # kW/time step, 1, 2.5, or 5 MW - max_capacity: 10000.0 # kWh, 80 MWh + max_capacity: 10000.0 # kWh, 10 MWh max_soc_fraction: 0.9 # percent as decimal min_soc_fraction: 0.1 # percent as decimal init_soc_fraction: 0.9 # percent as decimal @@ -21,25 +21,25 @@ technologies: charge_efficiency: 1.0 # percent as decimal discharge_efficiency: 1.0 # percent as decimal control_parameters: - max_discharge_rate: 2500.0 # kW/time step - charge_equals_discharge: true - demand_profile_supervisor: !include demand_profiles/demand_profile_supervisor.yaml - dispatch_priority_demand_profile: demand_profile_supervisor - max_supervisor_events: 2 - max_supervisor_event_period: W + max_discharge_rate: 2500.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate + charge_equals_discharge: true # enforce symmetric charge and discharge power limits + demand_profile_supervisor: !include demand_profiles/demand_profile_supervisor.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. + dispatch_priority_demand_profile: demand_profile_supervisor # demand profile the controller prioritizes when deciding dispatch + max_supervisor_events: 2 # maximum number of peak events from the priority demand profile that the controller will respond to within each event period + max_supervisor_event_period: W # pandas-style period code for resetting event counts; W means per week, M means month, etc peak_range: - start: 12:00:00 - end: 17:00:00 + start: 12:00:00 # start of the preferred daily peak-shaving window + end: 17:00:00 # end of the preferred daily peak-shaving window advance_discharge_period: - units: h - val: 2 + units: h # time units applied to the advance-discharge offset + val: 2 # begin discharging this far ahead of the detected peak delay_charge_period: - units: h - val: 4 - allow_charge_in_peak_range: false + units: h # time units applied to the charge-delay offset + val: s # wait this long after the peak window before recharging + allow_charge_in_peak_range: false # if false, charging is blocked during the peak window min_peak_proximity: - units: h - val: 4 + units: h # time units used for the minimum distance-to-peak threshold + val: 4 # throws an error when the next peak is closer than this threshold cost_parameters: cost_year: 2024 energy_capex: 408 # $/kWh # conservative case for 2024 ATB utility scale batteries diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 1e00acc2b..7d2e78173 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -18,8 +18,8 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa """ Configuration class for the PeakLoadManagementOpenLoopStorageController. - Defines all parameters required to configure the peak-load management storage controller, - including storage constraints, efficiency parameters, peak detection, and operation strategies. + Defines the storage limits, efficiencies, and peak-selection rules used to + pre-compute an open-loop discharge and recharge schedule. Attributes: commodity (str): Name of the commodity being controlled @@ -37,12 +37,12 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa init_soc_fraction (float): Initial SOC as a fraction of `max_capacity`, between 0 and 1. max_charge_rate (float): Maximum rate at which the commodity can be charged (in units - per time step, e.g., "kg/time step"). This rate does not include the charge_efficiency. + per time, e.g., "kg/h"). This rate does not include the charge_efficiency. charge_equals_discharge (bool, optional): If True, set the max_discharge_rate equal to the max_charge_rate. If False, specify the max_discharge_rate as a value different than the max_charge_rate. Defaults to True. max_discharge_rate (float | None, optional): Maximum rate at which the commodity can be - discharged (in units per time step, e.g., "kg/time step"). This rate does not include + discharged (in units per time, e.g., "kg/h"). This rate does not include the discharge_efficiency. Only required if `charge_equals_discharge` is False. charge_efficiency (float | None, optional): Efficiency of charging the storage, represented as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if @@ -55,19 +55,38 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are provided. commodity_amount_units (str | None, optional): Units of the commodity as an amount - (i.e., kW*h or kg). If not provided, defaults to commodity_rate_units*h. + (e.g., kW*h or kg). If not provided, defaults to commodity_rate_units*h. demand_profile_supervisor (int | float | list | None, optional): Demand values for additional connected system for each timestep, in the same units as `commodity_rate_units`. May be a scalar for constant demand or a list/array for time-varying demand. dispatch_priority_demand_profile (str | None, optional): which demand profile takes precedence for dispatch decisions. - max_supervisor_event_period: (int | None, optional): Duration, in time steps, of the period - in which the max_supervisor_events must occur. Defaults to the length of the simulation, - or in other words self.n_timesteps max_supervisor_events: (int | None, optional): The maximum number of discharge events - allowed for the supervisor in the period specified in max_supervisor_event_period, + allowed for the priority profile in the period specified in max_supervisor_event_period, or across all time steps if max_supervisor_event_period is None. + max_supervisor_event_period: (int | None, optional): Duration, in time steps, of the period + in which the max_supervisor_events must occur or a str indicating the time period (e.g. + W for week, M for month). Defaults to the length of the simulation. + peak_range (dict): Daily time window restricting which timesteps are considered as peak + candidates in the secondary demand profile. Keys ``start`` and ``end`` must be + ``HH:MM:SS`` strings (e.g. ``{'start': '12:00:00', 'end': '17:00:00'}``). Only + the highest-demand timestep within this window is marked as a candidate peak for + each day. + advance_discharge_period (dict): Lead time before a detected peak at which discharge + mode activates. Dict with keys ``units`` (pandas timedelta unit string, e.g. ``'h'``) + and ``val`` (numeric). For example ``{'units': 'h', 'val': 2}`` begins discharge two + hours before the identified peak. + delay_charge_period (dict): Minimum time to wait after the battery reaches minimum SOC + before recharging is permitted. Dict with keys ``units`` and ``val``, using the same + format as ``advance_discharge_period``. + allow_charge_in_peak_range (bool, optional): If ``True``, charging is never suppressed. + If ``False``, charging is blocked for timesteps that fall inside ``peak_range`` to + prevent charging whilst peak demand is expected. Defaults to ``True``. + min_peak_proximity (dict): Minimum required time separation between consecutive retained + peak events. A ``ValueError`` is raised during setup if selected peaks violate this + constraint. Dict with keys ``units`` and ``val``, using the same format as + ``advance_discharge_period``. """ @@ -155,12 +174,49 @@ def __attrs_post_init__(self): self.max_discharge_rate = self.max_charge_rate - # make sure peak_range is in correct format because yaml - # automatically converts it to seconds + # Validate and normalize dict parameters + # peak_range: must have 'start' and 'end' keys as HH:MM:SS strings. + # YAML automatically converts HH:MM:SS to an integer number of seconds, + # so non-string values are converted back here. + for _key in ("start", "end"): + if _key not in self.peak_range: + raise ValueError( + f"peak_range is missing required key '{_key}'. " + "Expected dict with 'start' and 'end' as HH:MM:SS strings." + ) for key, value in self.peak_range.items(): if not isinstance(value, str): self.peak_range[key] = str(timedelta(seconds=value)) + # advance_discharge_period / delay_charge_period / min_peak_proximity: + # must each be a dict with 'units' (str) and 'val' (int or float). + for _param_name, _param_val in ( + ("advance_discharge_period", self.advance_discharge_period), + ("delay_charge_period", self.delay_charge_period), + ("min_peak_proximity", self.min_peak_proximity), + ): + if not isinstance(_param_val, dict): + raise ValueError( + f"'{_param_name}' must be a dict with keys 'units' and 'val', " + f"got {type(_param_val).__name__}." + ) + for _key in ("units", "val"): + if _key not in _param_val: + raise ValueError( + f"'{_param_name}' is missing required key '{_key}'. " + "Expected dict with 'units' (str) and 'val' (int or float)." + ) + if not isinstance(_param_val["units"], str) or not _param_val["units"].strip(): + raise ValueError( + f"'{_param_name}[\"units\"]' must be a non-empty string, " + f"got {_param_val['units']!r}." + ) + if not isinstance(_param_val["val"], int | float): + raise ValueError( + f"'{_param_name}[\"val\"]' must be a numeric value (int or float), " + f"got {type(_param_val['val']).__name__}." + ) + class PeakLoadManagementOpenLoopStorageController(StorageOpenLoopControlBase): """ diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 2c59ae3ef..25ef40599 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -436,7 +436,9 @@ def test_plm_controller_basic_discharge_before_peak(subtests): "charge_equals_discharge": False, "charge_efficiency": 0.95, "discharge_efficiency": 0.95, - "demand_profile": [10.0] * 10 + [50.0] * 4 + [10.0] * 10, # Peak at hours 10-14 + "demand_profile": np.concatenate( + (np.full(10, 10.0), np.full(4, 50.0), np.full(10, 10.0)) + ), # Peak at hours 10-14 "peak_range": {"start": "10:00:00", "end": "14:00:00"}, "advance_discharge_period": {"units": "h", "val": 2}, "delay_charge_period": {"units": "h", "val": 1}, @@ -450,7 +452,17 @@ def test_plm_controller_basic_discharge_before_peak(subtests): "PeakLoadManagementOpenLoopStorageController" ) - plant_config = {"plant": {"plant_life": 30, "simulation": {"n_timesteps": 24, "dt": 3600}}} + plant_config = { + "plant": { + "plant_life": 30, + "simulation": { + "n_timesteps": 24, + "dt": 3600, + "timezone": 0, + "start_time": "01/01/2000 00:00:00", + }, + } + } # Set up OpenMDAO problem prob = om.Problem() @@ -534,13 +546,23 @@ def test_plm_controller_respects_soc_bounds(subtests): "PeakLoadManagementOpenLoopStorageController" ) - plant_config = {"plant": {"plant_life": 30, "simulation": {"n_timesteps": 12, "dt": 3600}}} + plant_config = { + "plant": { + "plant_life": 30, + "simulation": { + "n_timesteps": 12, + "dt": 3600, + "timezone": 0, + "start_time": "01/01/2000 00:00:00", + }, + } + } prob = om.Problem() prob.model.add_subsystem( name="IVC", - subsys=om.IndepVarComp(name="hydrogen_in", val=[20.0] * 12), + subsys=om.IndepVarComp(name="hydrogen_in", val=20, shape=12), promotes=["*"], ) @@ -596,7 +618,7 @@ def test_plm_controller_blocking_charge_in_peak_range(subtests): "charge_equals_discharge": False, "charge_efficiency": 0.92, "discharge_efficiency": 0.92, - "demand_profile": [5.0] * 24, + "demand_profile": np.full(24, 5.0), "demand_profile_supervisor": None, "peak_range": {"start": peak_window_start, "end": peak_window_end}, "advance_discharge_period": {"units": "h", "val": 3}, @@ -610,7 +632,17 @@ def test_plm_controller_blocking_charge_in_peak_range(subtests): "PeakLoadManagementOpenLoopStorageController" ) - plant_config = {"plant": {"plant_life": 30, "simulation": {"n_timesteps": 24, "dt": 3600}}} + plant_config = { + "plant": { + "plant_life": 30, + "simulation": { + "n_timesteps": 24, + "dt": 3600, + "timezone": 0, + "start_time": "01/01/2000 00:00:00", + }, + } + } prob = om.Problem() diff --git a/h2integrate/core/inputs/plant_schema.yaml b/h2integrate/core/inputs/plant_schema.yaml index eabcf4280..1254f65e4 100644 --- a/h2integrate/core/inputs/plant_schema.yaml +++ b/h2integrate/core/inputs/plant_schema.yaml @@ -60,6 +60,7 @@ properties: timezone: type: number description: timezone as UTC offset corresponding to start_time + default: 0 minimum: -12 maximum: 14 required: [dt, n_timesteps] diff --git a/h2integrate/core/test/test_utilities.py b/h2integrate/core/test/test_utilities.py index feb75cf9b..879dec681 100644 --- a/h2integrate/core/test/test_utilities.py +++ b/h2integrate/core/test/test_utilities.py @@ -551,37 +551,14 @@ def traverse_dict(sample_dict): @pytest.mark.unit -def test_build_time_series_from_plant_config_default_start_time(): - plant_config = { - "plant": { - "simulation": { - "n_timesteps": 4, - "dt": 3600, - } - } - } - - ts = build_time_series_from_plant_config(plant_config) - - expected = pd.to_datetime( - [ - "2000-01-01 00:00:00", - "2000-01-01 01:00:00", - "2000-01-01 02:00:00", - "2000-01-01 03:00:00", - ] - ) - pd.testing.assert_index_equal(ts, pd.DatetimeIndex(expected)) - - -@pytest.mark.unit -def test_build_time_series_from_plant_config_with_start_time(): +def test_build_time_series_from_plant_config(): plant_config = { "plant": { "simulation": { "n_timesteps": 5, "dt": 1800, "start_time": "2025-01-01 06:30:00", + "timezone": 0, } } } @@ -590,11 +567,14 @@ def test_build_time_series_from_plant_config_with_start_time(): expected = pd.to_datetime( [ - "2025-01-01 06:30:00", - "2025-01-01 07:00:00", - "2025-01-01 07:30:00", - "2025-01-01 08:00:00", - "2025-01-01 08:30:00", + "2025-01-01 06:30:00+00:00", + "2025-01-01 07:00:00+00:00", + "2025-01-01 07:30:00+00:00", + "2025-01-01 08:00:00+00:00", + "2025-01-01 08:30:00+00:00", ] - ) - pd.testing.assert_index_equal(ts, pd.DatetimeIndex(expected)) + ).to_pydatetime() + import pdb + + pdb.set_trace() + assert (ts == expected).all() diff --git a/h2integrate/core/utilities.py b/h2integrate/core/utilities.py index fcc2e58fe..1244c0b5f 100644 --- a/h2integrate/core/utilities.py +++ b/h2integrate/core/utilities.py @@ -199,10 +199,23 @@ def build_time_series_from_plant_config(plant_config): simulation_cfg = plant_config["plant"]["simulation"] n_timesteps = int(simulation_cfg["n_timesteps"]) dt_seconds = int(simulation_cfg["dt"]) + tz = int(simulation_cfg["timezone"]) + start_time = simulation_cfg["start_time"] + return build_time_series( + start_time=start_time, dt_seconds=dt_seconds, n_timesteps=n_timesteps, time_zone=tz + ) + + +def build_time_series( + start_time: str, + dt_seconds: int, + n_timesteps: int, + time_zone: int, + start_year: int | None = None, +): # Optional start_time in config; default to a fixed reference timestamp. - start_time = simulation_cfg.get("start_time", "2000-01-01 00:00:00") - start_timestamp = pd.to_datetime(start_time) + start_timestamp = pd.Timestamp(start_time, tz=time_zone, year=start_year) freq = pd.to_timedelta(dt_seconds, unit="s") - return pd.date_range(start=start_timestamp, periods=n_timesteps, freq=freq) + return pd.date_range(start=start_timestamp, periods=n_timesteps, freq=freq).to_pydatetime() From 5e6ef34a0a08b9a241fe26e8e0b0708ba28ee2ee Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 8 Apr 2026 15:21:29 -0600 Subject: [PATCH 18/49] move dispatch strategy outline to doc string --- .../plm_openloop_storage_controller.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 7d2e78173..2fd20ea86 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -381,6 +381,17 @@ def compute(self, inputs, outputs): to constraints). SOC is updated at each time step, ensuring it remains within allowable bounds. + Dispatch strategy outline: + - Discharge: + * Starting when time_to_peak <= advance_discharge_period + * Discharge at max rate (or less to reach targets) + * Stop discharging only when SOC reaches min_soc + - Charge: + * When not discharging, SOC < max, and allow_charge window is active + * Start charging only after delay_charge_period since last discharge + * Charge at max rate (or less to reach target) + * Stop charging when SOC reaches max_soc + Expected input keys: * ``_in``: Timeseries of commodity available at each time step. * ``_demand``: Timeseries demand profile. @@ -405,15 +416,6 @@ def compute(self, inputs, outputs): None """ - # Dispatch strategy outline: - # - Discharge: Starting when time_to_peak <= advance_discharge_period - # * Discharge at max rate (or less to reach targets) - # * Stop discharging only when SOC reaches min_soc - # - Charge: When not discharging, SOC < max, and allow_charge window is active - # * Start charging only after delay_charge_period since last discharge - # * Charge at max rate (or less to reach target) - # * Stop charging when SOC reaches max_soc - commodity = self.config.commodity if np.all(inputs[f"{commodity}_demand"] == 0.0): msg = "Demand profile is zero, check that demand profile is input" From 1a344e6abf72e83d39002fc4ab04b88ad4bdf3d0 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 8 Apr 2026 16:34:32 -0600 Subject: [PATCH 19/49] shift merge_peaks method from using primary and secondary to peaks_1 and peaks_2 --- .../plm_openloop_storage_controller.py | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 2fd20ea86..e885a03dd 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -104,7 +104,7 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa dispatch_priority_demand_profile: str = field( validator=contains(["demand_profile", "demand_profile_supervisor"]), ) - max_supervisor_events: int | None = (field(default=None),) + max_supervisor_events: int | None = field(default=None) max_supervisor_event_period: int | str | None = field(default=None) peak_range: dict = field( metadata={ @@ -290,9 +290,16 @@ def setup(self): ) # Store simulation parameters for later use - self.dt = self.options["plant_config"]["plant"]["simulation"]["dt"] self.time_index = build_time_series_from_plant_config(self.options["plant_config"]) + if len(self.time_index) != self.n_timesteps: + raise ( + ValueError( + f"Time series is of length {len(self.time_index)}, " + f"but self.n_timesteps is {self.n_timesteps}." + ) + ) + # Build timestamped demand dictionaries from simulation timeline. secondary_demand_profile = self._build_demand_profile_dict( self.config.demand_profile, @@ -691,37 +698,35 @@ def get_peaks( return demand_df.drop(columns=["period_day"]) @staticmethod - def merge_peaks(supervisory_peaks_df, secondary_peaks_df): - """Merge supervisor and secondary peak schedules with supervisor precedence. + def merge_peaks(peaks_1, peaks_2): + """Merge peaks_1 and peak_2 schedules with peak_1 precedence. Combines two peak schedules (primary and fallback) using day-level precedence: - - For each day, if the primary (supervisory) profile has any peaks on that day, - use all primary peaks for that day - - Otherwise, use the secondary peaks for that day + - For each day, if the peaks_1 profile has any peaks on that day, + use all peaks_1 peaks for that day + - Otherwise, use the peaks_2 peaks for that day - This allows critical demand (supervisor) to take scheduling precedence while - falling back to secondary peaks for days with no critical demand. + This allows overriding peaks (peaks_1) to take scheduling precedence while + falling back to peaks_2 peaks for days with no overriding peaks. Args: - supervisory_peaks_df (pd.DataFrame | None): Primary peak schedule with columns + peaks_1 (pd.DataFrame | None): primary peak schedule with columns ['date_time', 'is_peak', 'demand', ...]. - secondary_peaks_df (pd.DataFrame): Secondary/fallback peak schedule with same columns. + peaks_2 (pd.DataFrame): fallback peak schedule with same columns. Returns: - pd.DataFrame: Merged peak schedule. If supervisory is None, returns secondary unchanged. - Otherwise, returns secondary with 'is_peak' flags overridden on supervisor-peak + pd.DataFrame: Merged peak schedule. If peaks_2 is None, returns peaks_1 unchanged. + Otherwise, returns peaks_2 with 'is_peak' flags overridden on peak_1 peak days. """ - if secondary_peaks_df is None: - peaks_df = supervisory_peaks_df.copy() + if peaks_2 is None: + peaks_df = peaks_1.copy() else: - peaks_df = secondary_peaks_df.copy() + peaks_df = peaks_2.copy() # For each day in the data, check if supervisor has any peaks - for day in secondary_peaks_df["date_time"].dt.floor("D").unique(): - day_df = supervisory_peaks_df[ - supervisory_peaks_df["date_time"].dt.floor("D") == day - ] - # If supervisor has peaks on the day, use supervisor's flags for all rows that day + for day in peaks_2["date_time"].dt.floor("D").unique(): + day_df = peaks_1[peaks_1["date_time"].dt.floor("D") == day] + # If peaks_1 has peaks on the day, use peaks_1's flags for all rows that day if any(day_df["is_peak"]): peaks_df.loc[peaks_df["date_time"].dt.floor("D") == day, "is_peak"] = day_df[ "is_peak" From ca878edac02da2d687a2ae07bd31bd8980548a91 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 8 Apr 2026 16:37:13 -0600 Subject: [PATCH 20/49] add check against peaks_1 being None --- .../storage/plm_openloop_storage_controller.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index e885a03dd..eb87d0d7b 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -719,7 +719,9 @@ def merge_peaks(peaks_1, peaks_2): Otherwise, returns peaks_2 with 'is_peak' flags overridden on peak_1 peak days. """ - if peaks_2 is None: + if peaks_1 is None: + raise (ValueError("Input, peaks_1, must contain a dataframe, but None was given.")) + elif peaks_2 is None: peaks_df = peaks_1.copy() else: peaks_df = peaks_2.copy() From a0bb55566ab30ddb916b6af094c0921dfdd2045a Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 8 Apr 2026 16:39:02 -0600 Subject: [PATCH 21/49] rename get_allowed_discharge to get_allowed_charge --- .../storage/plm_openloop_storage_controller.py | 4 ++-- .../storage/test/test_plm_openloop_storage_controller.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index eb87d0d7b..f4f0c3bc0 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -335,7 +335,7 @@ def setup(self): self.get_time_to_peak() - self.get_allowed_discharge() + self.get_allowed_charge() @staticmethod def _build_demand_profile_dict(demand_profile, time_series): @@ -763,7 +763,7 @@ def get_time_to_peak(self): next_peak_time - self.peaks_df.loc[idx, "date_time"] ) - def get_allowed_discharge(self): + def get_allowed_charge(self): """Compute allowed charging time windows based on peak range configuration. Determines for each timestep whether charging is permitted. If diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 25ef40599..9fd7b9c08 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -353,7 +353,7 @@ def _make_controller_with_config(allow_charge_in_peak_range, peak_range): @pytest.mark.unit -def test_get_allowed_discharge_always_true_when_charge_allowed_in_peak_range(): +def test_get_allowed_charge_always_true_when_charge_allowed_in_peak_range(): """When allow_charge_in_peak_range=True every row should allow charging.""" controller = _make_controller_with_config( allow_charge_in_peak_range=True, @@ -374,13 +374,13 @@ def test_get_allowed_discharge_always_true_when_charge_allowed_in_peak_range(): ) controller.n_timesteps = 3 - controller.get_allowed_discharge() + controller.get_allowed_charge() assert controller.peaks_df["allow_charge"].tolist() == [True, True, True] @pytest.mark.unit -def test_get_allowed_discharge_blocks_charge_inside_peak_range(subtests): +def test_get_allowed_charge_blocks_charge_inside_peak_range(subtests): """When allow_charge_in_peak_range=False, rows inside the window get allow_charge=False.""" controller = _make_controller_with_config( allow_charge_in_peak_range=False, @@ -402,7 +402,7 @@ def test_get_allowed_discharge_blocks_charge_inside_peak_range(subtests): ) controller.n_timesteps = 4 - controller.get_allowed_discharge() + controller.get_allowed_charge() with subtests.test("before range allows charge"): assert controller.peaks_df["allow_charge"].iloc[0] is np.True_ From cef5b020b99001eaf57662566be25a32de6b961d Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 09:05:52 -0600 Subject: [PATCH 22/49] minor renaming and logic adjustments based on pr reviews --- .../plm_openloop_storage_controller.py | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index f4f0c3bc0..c446e39a1 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -22,12 +22,6 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa pre-compute an open-loop discharge and recharge schedule. Attributes: - commodity (str): Name of the commodity being controlled - (e.g., "hydrogen"). Stripped of whitespace. - commodity_rate_units (str): Units of the commodity (e.g., "kg/h"). - demand_profile (int | float | list): Demand values for each timestep, in - the same units as `commodity_rate_units`. May be a scalar for constant - demand or a list/array for time-varying demand. max_capacity (float): Maximum storage capacity of the commodity (in non-rate units, e.g., "kg" if `commodity_rate_units` is "kg/h"). max_soc_fraction (float): Maximum allowable state of charge (SOC) as a fraction @@ -54,8 +48,6 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa discharging the storage, represented as a decimal between 0 and 1 (e.g., 0.81 for 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are provided. - commodity_amount_units (str | None, optional): Units of the commodity as an amount - (e.g., kW*h or kg). If not provided, defaults to commodity_rate_units*h. demand_profile_supervisor (int | float | list | None, optional): Demand values for additional connected system for each timestep, in the same units as `commodity_rate_units`. May be a scalar for constant demand or a list/array for @@ -358,7 +350,7 @@ def _build_demand_profile_dict(demand_profile, time_series): } @staticmethod - def _normalize_peak_range(peak_range): + def _parse_peak_range(peak_range): """Validate and parse peak_range values from HH:MM:SS strings. Returns a dict with datetime.time objects. @@ -496,19 +488,18 @@ def compute(self, inputs, outputs): # start discharging when we approach a peak and have some charge if time_to_peak <= advance_discharge_period and soc > soc_min: discharging = True + charging = False if not discharging and soc < soc_max: if self.peaks_df["allow_charge"].iloc[i]: if (td - last_discharge) > delay_charge_period: charging = True + discharging = False if discharging: # DISCHARGE MODE: Supply commodity to meet peak demand # Note: discharge_needed is internal (storage view), max_discharge_rate is external - discharge_needed = max_discharge_rate / discharge_eff - discharge = min( - discharge_needed, available_discharge, max_discharge_rate / discharge_eff - ) + discharge = min(available_discharge, max_discharge_rate / discharge_eff) soc -= discharge / max_capacity # Deplete storage state of charge # Output setpoint is the external (delivered) rate after efficiency loss @@ -590,7 +581,7 @@ def get_peaks( if not isinstance(demand_profile, dict): raise ValueError("demand_profile must be a dict with 'date_time' and 'demand' keys") - peak_range = PeakLoadManagementOpenLoopStorageController._normalize_peak_range(peak_range) + peak_range = PeakLoadManagementOpenLoopStorageController._parse_peak_range(peak_range) demand_df = pd.DataFrame(demand_profile) if "date_time" not in demand_df or "demand" not in demand_df: @@ -778,7 +769,7 @@ def get_allowed_charge(self): # Global allow: charging always permitted self.peaks_df["allow_charge"] = True else: - peak_range = self._normalize_peak_range(self.config.peak_range) + peak_range = self._parse_peak_range(self.config.peak_range) # Selective allow: suppress charging during peak window only self.peaks_df["allow_charge"] = False for i in range(self.n_timesteps): From fe01f8fc93791f9ea0b7587983d2f82a94dd65fa Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 12:20:52 -0600 Subject: [PATCH 23/49] rename from supervisor and secondary to _1 and _2 --- .../plm_openloop_storage_controller.py | 100 +++++++++--------- .../test_plm_openloop_storage_controller.py | 34 +++--- 2 files changed, 65 insertions(+), 69 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index c446e39a1..da78c54c0 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -48,20 +48,20 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa discharging the storage, represented as a decimal between 0 and 1 (e.g., 0.81 for 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are provided. - demand_profile_supervisor (int | float | list | None, optional): Demand values for + demand_profile_2 (int | float | list | None, optional): Demand values for additional connected system for each timestep, in the same units as `commodity_rate_units`. May be a scalar for constant demand or a list/array for time-varying demand. dispatch_priority_demand_profile (str | None, optional): which demand profile takes - precedence for dispatch decisions. - max_supervisor_events: (int | None, optional): The maximum number of discharge events - allowed for the priority profile in the period specified in max_supervisor_event_period, - or across all time steps if max_supervisor_event_period is None. - max_supervisor_event_period: (int | None, optional): Duration, in time steps, of the period - in which the max_supervisor_events must occur or a str indicating the time period (e.g. + precedence for dispatch decisions. One of ["demand_profile", "demand_profile_2"]. + n_override_events: (int | None, optional): The maximum number of discharge events + allowed for the priority profile in the period specified in override_events_period, + or across all time steps if override_events_period is None. + override_events_period: (int | None, optional): Duration, in time steps, of the period + in which the n_override_events must occur or a str indicating the time period (e.g. W for week, M for month). Defaults to the length of the simulation. peak_range (dict): Daily time window restricting which timesteps are considered as peak - candidates in the secondary demand profile. Keys ``start`` and ``end`` must be + candidates in the primary demand profile. Keys ``start`` and ``end`` must be ``HH:MM:SS`` strings (e.g. ``{'start': '12:00:00', 'end': '17:00:00'}``). Only the highest-demand timestep within this window is marked as a candidate peak for each day. @@ -92,12 +92,12 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - demand_profile_supervisor: int | float | list | None = field() + demand_profile_2: int | float | list | None = field() dispatch_priority_demand_profile: str = field( - validator=contains(["demand_profile", "demand_profile_supervisor"]), + validator=contains(["demand_profile", "demand_profile_2"]), ) - max_supervisor_events: int | None = field(default=None) - max_supervisor_event_period: int | str | None = field(default=None) + n_override_events: int | None = field(default=None) + override_events_period: int | str | None = field(default=None) peak_range: dict = field( metadata={ "description": "Daily time window for peak detection. " @@ -232,8 +232,8 @@ def setup(self): During setup: 1. Loads and validates configuration from tech_config and plant_config options 2. Registers OpenMDAO inputs for storage parameters (capacity, charge rates, etc.) - 3. Detects peaks in the demand profile (supervisor and secondary) - 4. Merges peaks with supervisor prioritization if configured + 3. Detects peaks in the demand profile (demand_profile and demand_profile_2) + 4. Merges peaks with demand_profile_2 prioritization if configured 5. Computes time-to-next-peak for each timestep 6. Identifies allowed charging windows based on peak_range configuration @@ -248,12 +248,12 @@ def setup(self): super().setup() if ( - self.config.demand_profile_supervisor is None - and self.config.dispatch_priority_demand_profile == "demand_profile_supervisor" + self.config.demand_profile_2 is None + and self.config.dispatch_priority_demand_profile == "demand_profile_2" ): raise ( ValueError( - "If demand_profile_supervisor is None, then dispatch_priority_demand_profile" + "If demand_profile_2 is None, then dispatch_priority_demand_profile" "must be demand_profile" ) ) @@ -292,42 +292,20 @@ def setup(self): ) ) - # Build timestamped demand dictionaries from simulation timeline. - secondary_demand_profile = self._build_demand_profile_dict( - self.config.demand_profile, - self.time_index, - ) - - # Detect peaks in supervisor demand profile (if provided) - if self.config.demand_profile_supervisor is not None: - supervisor_demand_profile = self._build_demand_profile_dict( - self.config.demand_profile_supervisor, + # Detect peaks in demand profile 2 (if provided) + if self.config.demand_profile_2 is not None: + demand_profile_2 = self._build_demand_profile_dict( + self.config.demand_profile_2, self.time_index, ) - self.supervisor_peaks_df = self.get_peaks( - demand_profile=supervisor_demand_profile, - n_max_events=self.config.max_supervisor_events, - max_events_period=self.config.max_supervisor_event_period, + self.peaks_2_df = self.get_peaks( + demand_profile=demand_profile_2, + n_max_events=self.config.max_events, + max_events_period=self.config.override_events_period, min_proximity=self.config.min_peak_proximity, ) else: - self.supervisor_peaks_df = None - - # Detect daily peaks in secondary demand profile (always computed) - # Respects the configured peak_range time window for each day - self.secondary_peaks_df = self.get_peaks( - demand_profile=secondary_demand_profile, - peak_range=self.config.peak_range, - ) - - if self.config.dispatch_priority_demand_profile == "demand_profile_supervisor": - self.peaks_df = self.merge_peaks(self.supervisor_peaks_df, self.secondary_peaks_df) - else: - self.peaks_df = self.merge_peaks(self.secondary_peaks_df, self.supervisor_peaks_df) - - self.get_time_to_peak() - - self.get_allowed_charge() + self.peaks_2_df = None @staticmethod def _build_demand_profile_dict(demand_profile, time_series): @@ -447,12 +425,32 @@ def compute(self, inputs, outputs): charge_eff = float(self.config.charge_efficiency) discharge_eff = float(self.config.discharge_efficiency) + # Build timestamped demand dictionaries from simulation timeline. + demand_profile = self._build_demand_profile_dict( + inputs[f"{self.config.commodity}_demand"], + self.time_index, + ) + + # Detect daily peaks in demand profile (always computed) + # Respects the configured peak_range time window for each day + self.peaks_1_df = self.get_peaks( + demand_profile=demand_profile, + peak_range=self.config.peak_range, + ) + + if self.config.dispatch_priority_demand_profile == "demand_profile_2": + self.peaks_df = self.merge_peaks(self.peaks_2_df, self.peaks_1_df) + else: + self.peaks_df = self.merge_peaks(self.peaks_1_df, self.peaks_2_df) + + self.get_time_to_peak() + + self.get_allowed_charge() + # Initialize time-step state of charge prior to loop so the loop starts with # the previous time step's value soc = deepcopy(init_soc_fraction) - # demand_profile = inputs[f"{commodity}_demand"] - # initialize outputs soc_array = np.zeros(self.n_timesteps) set_point_array = np.zeros(self.n_timesteps) @@ -716,9 +714,9 @@ def merge_peaks(peaks_1, peaks_2): peaks_df = peaks_1.copy() else: peaks_df = peaks_2.copy() - # For each day in the data, check if supervisor has any peaks for day in peaks_2["date_time"].dt.floor("D").unique(): day_df = peaks_1[peaks_1["date_time"].dt.floor("D") == day] + # For each day in the data, check if peaks_1 has any peaks # If peaks_1 has peaks on the day, use peaks_1's flags for all rows that day if any(day_df["is_peak"]): peaks_df.loc[peaks_df["date_time"].dt.floor("D") == day, "is_peak"] = day_df[ diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 9fd7b9c08..63b914c38 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -205,8 +205,8 @@ def test_get_peaks_invalid_min_proximity_raises(): @pytest.mark.unit -def test_merge_peaks_without_supervisor_returns_secondary_flags(subtests): - secondary_peaks_df = pd.DataFrame( +def test_merge_peaks_with_single_demand_profile_returns_correct_peaks_flags(subtests): + peaks_1_df = pd.DataFrame( { "date_time": pd.to_datetime( [ @@ -221,15 +221,15 @@ def test_merge_peaks_without_supervisor_returns_secondary_flags(subtests): } ) - merged = PeakLoadManagementOpenLoopStorageController.merge_peaks(secondary_peaks_df, None) + merged = PeakLoadManagementOpenLoopStorageController.merge_peaks(peaks_1_df, None) with subtests.test("peak flags unchanged"): - assert merged["is_peak"].tolist() == secondary_peaks_df["is_peak"].tolist() + assert merged["is_peak"].tolist() == peaks_1_df["is_peak"].tolist() @pytest.mark.unit -def test_merge_peaks_supervisor_takes_precedence_on_same_day(subtests): - secondary_peaks_df = pd.DataFrame( +def test_merge_peaks_profile2_takes_precedence_on_same_day(subtests): + peaks_1_df = pd.DataFrame( { "date_time": pd.to_datetime( [ @@ -243,7 +243,7 @@ def test_merge_peaks_supervisor_takes_precedence_on_same_day(subtests): "demand": [1.0, 5.0, 1.0, 6.0], } ) - supervisory_peaks_df = pd.DataFrame( + peaks_2_df = pd.DataFrame( { "date_time": pd.to_datetime( [ @@ -259,19 +259,17 @@ def test_merge_peaks_supervisor_takes_precedence_on_same_day(subtests): ) merged = PeakLoadManagementOpenLoopStorageController.merge_peaks( - supervisory_peaks_df, - secondary_peaks_df, + peaks_2_df, + peaks_1_df, ) - with subtests.test("day1 follows supervisor flags"): - np.testing.assert_array_equal( - merged["is_peak"].iloc[0:2], supervisory_peaks_df["is_peak"].iloc[0:2] - ) + with subtests.test("day1 follows peaks_2 flags"): + np.testing.assert_array_equal(merged["is_peak"].iloc[0:2], peaks_2_df["is_peak"].iloc[0:2]) - with subtests.test("day2 follows secondary flags"): + with subtests.test("day2 follows peaks_1 flags"): np.testing.assert_array_equal( merged["is_peak"].iloc[2:4], - secondary_peaks_df["is_peak"].iloc[2:4], + peaks_1_df["is_peak"].iloc[2:4], ) @@ -443,7 +441,7 @@ def test_plm_controller_basic_discharge_before_peak(subtests): "advance_discharge_period": {"units": "h", "val": 2}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": False, - "demand_profile_supervisor": None, + "demand_profile_2": None, "dispatch_priority_demand_profile": "demand_profile", "min_peak_proximity": {"units": "h", "val": 4}, } @@ -537,7 +535,7 @@ def test_plm_controller_respects_soc_bounds(subtests): "advance_discharge_period": {"units": "h", "val": 1}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": True, - "demand_profile_supervisor": None, + "demand_profile_2": None, "dispatch_priority_demand_profile": "demand_profile", "min_peak_proximity": {"units": "h", "val": 4}, } @@ -619,7 +617,7 @@ def test_plm_controller_blocking_charge_in_peak_range(subtests): "charge_efficiency": 0.92, "discharge_efficiency": 0.92, "demand_profile": np.full(24, 5.0), - "demand_profile_supervisor": None, + "demand_profile_2": None, "peak_range": {"start": peak_window_start, "end": peak_window_end}, "advance_discharge_period": {"units": "h", "val": 3}, "delay_charge_period": {"units": "h", "val": 1}, From 5527570ab4d52897fcf36b8ec492680016eac70e Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 12:43:53 -0600 Subject: [PATCH 24/49] adjust variable naming --- .../run_peak_load_management.py | 6 +-- .../33_peak_load_management/tech_config.yaml | 12 ++--- .../plm_openloop_storage_controller.py | 46 ++++++++++--------- .../test_plm_openloop_storage_controller.py | 16 ++++--- 4 files changed, 42 insertions(+), 38 deletions(-) diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index a974079fe..3fc64b695 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -23,7 +23,7 @@ supervisor_demand = np.array( model.technology_config["technologies"]["battery"]["model_inputs"]["control_parameters"][ - "demand_profile_supervisor" + "demand_profile_2" ] ) secondary_demand = model.prob.get_val("battery.electricity_demand") @@ -34,8 +34,8 @@ time_plot = time_series[:n_plot] fig, ax = plt.subplots(4, 1, sharex=True) -ax[0].plot(time_plot, supervisor_demand[:n_plot] * 1e-3, label="Supervisory demand (MW)") -ax[0].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Secondary demand (MW)") +ax[0].plot(time_plot, supervisor_demand[:n_plot] * 1e-3, label="Overriding demand (MW)") +ax[0].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[0].set_ylabel("Power (MW)") ax[0].legend(loc="upper right") diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index a913ed38e..43d5b4d68 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -17,16 +17,16 @@ technologies: max_soc_fraction: 0.9 # percent as decimal min_soc_fraction: 0.1 # percent as decimal init_soc_fraction: 0.9 # percent as decimal - demand_profile: !include demand_profiles/demand_profile_secondary.yaml + demand_profile: !include demand_profiles/demand_profile.yaml charge_efficiency: 1.0 # percent as decimal discharge_efficiency: 1.0 # percent as decimal control_parameters: max_discharge_rate: 2500.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate charge_equals_discharge: true # enforce symmetric charge and discharge power limits - demand_profile_supervisor: !include demand_profiles/demand_profile_supervisor.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. - dispatch_priority_demand_profile: demand_profile_supervisor # demand profile the controller prioritizes when deciding dispatch - max_supervisor_events: 2 # maximum number of peak events from the priority demand profile that the controller will respond to within each event period - max_supervisor_event_period: W # pandas-style period code for resetting event counts; W means per week, M means month, etc + demand_profile_2: !include demand_profiles/demand_profile_2.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. + dispatch_priority_demand_profile: demand_profile_2 # demand profile the controller prioritizes when deciding dispatch + n_override_events: 2 # maximum number of peak events from the priority demand profile that the controller will respond to within each event period + override_events_period: W # pandas-style period code for resetting event counts; W means per week, M means month, etc peak_range: start: 12:00:00 # start of the preferred daily peak-shaving window end: 17:00:00 # end of the preferred daily peak-shaving window @@ -35,7 +35,7 @@ technologies: val: 2 # begin discharging this far ahead of the detected peak delay_charge_period: units: h # time units applied to the charge-delay offset - val: s # wait this long after the peak window before recharging + val: 4 # wait this long after the peak window before recharging allow_charge_in_peak_range: false # if false, charging is blocked during the peak window min_peak_proximity: units: h # time units used for the minimum distance-to-peak threshold diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index da78c54c0..d66c0dd50 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -300,8 +300,8 @@ def setup(self): ) self.peaks_2_df = self.get_peaks( demand_profile=demand_profile_2, - n_max_events=self.config.max_events, - max_events_period=self.config.override_events_period, + n_override_events=self.config.n_override_events, + override_events_period=self.config.override_events_period, min_proximity=self.config.min_peak_proximity, ) else: @@ -536,8 +536,8 @@ def compute(self, inputs, outputs): @staticmethod def get_peaks( demand_profile: dict, - n_max_events=None, - max_events_period=None, + n_override_events=None, + override_events_period=None, min_proximity=None, peak_range={"start": "00:00:00", "end": "23:59:59"}, ): @@ -552,10 +552,10 @@ def get_peaks( demand_profile (dict): Timeseries data with keys: - 'date_time': timestamps (list or DatetimeIndex convertible) - 'demand': demand values (list or array) - n_max_events (int | None): Maximum number of peaks to keep globally or per period. + n_override_events (int | None): Maximum number of peaks to keep globally or per period. If None, returns all daily peaks. Defaults to None. - max_events_period (int | str | None): Grouping period for n_max_events limit. - - None: apply n_max_events limit globally (keep top-N peaks overall) + override_events_period (int | str | None): Grouping period for n_override_events limit. + - None: apply n_override_events limit globally (keep top-N peaks overall) - int: group by timestep intervals (e.g., 288 for 24-hour periods) - str: pandas period frequency (e.g., 'W' for week, 'M' for month) Defaults to None. @@ -605,49 +605,51 @@ def get_peaks( demand_df.loc[daily_peak_idx, "is_peak"] = True # Optional: Limit number of peaks globally or per period - if n_max_events is not None: - if n_max_events < 0: - raise ValueError("n_max_events must be >= 0 or None") + if n_override_events is not None: + if n_override_events < 0: + raise ValueError("n_override_events must be >= 0 or None") peak_candidates = demand_df.loc[demand_df["is_peak"]].copy() keep_idx = [] - if max_events_period is None: + if override_events_period is None: # Global limit: keep the N largest peaks across all time - keep_idx = peak_candidates.nlargest(n_max_events, "demand").index.tolist() + keep_idx = peak_candidates.nlargest(n_override_events, "demand").index.tolist() else: # Period-based limit: keep top-N peaks within each period - if isinstance(max_events_period, int): - if max_events_period <= 0: + if isinstance(override_events_period, int): + if override_events_period <= 0: raise ValueError( - "max_events_period must be positive when provided as an int" + "override_events_period must be positive when provided as an int" ) # Group by timestep intervals (e.g., 288 timesteps = 1 day) - demand_df["period_id"] = np.arange(len(demand_df)) // max_events_period + demand_df["period_id"] = np.arange(len(demand_df)) // override_events_period peak_candidates["period_id"] = demand_df.loc[peak_candidates.index, "period_id"] - elif isinstance(max_events_period, str): + elif isinstance(override_events_period, str): # Group by pandas period frequency (W=week, M=month, etc.) - period_freq = max_events_period.strip() + period_freq = override_events_period.strip() try: demand_df["period_id"] = demand_df["date_time"].dt.to_period(period_freq) except ValueError as exc: raise ValueError( - "Invalid max_events_period string. Use a pandas period frequency " + "Invalid override_events_period string. Use a pandas period frequency " "(for example 'Y', 'Q', 'M', 'W', 'D', 'H')." ) from exc peak_candidates["period_id"] = demand_df.loc[peak_candidates.index, "period_id"] else: raise ValueError( - "max_events_period must be None, a positive integer, or a pandas period " - "frequency string" + "override_events_period must be None, a positive integer, or a pandas " + "period frequency string" ) # Within each period, retain only the top-N peaks by demand for _, period_group in peak_candidates.groupby("period_id"): - keep_idx.extend(period_group.nlargest(n_max_events, "demand").index.tolist()) + keep_idx.extend( + period_group.nlargest(n_override_events, "demand").index.tolist() + ) demand_df = demand_df.drop(columns=["period_id"]) diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 63b914c38..0662711d6 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -52,7 +52,7 @@ def test_get_peaks_with_global_event_limit_expected_peak(): expected_peak_times = [pd.Timestamp("2025-01-01 06:00:00")] - peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period=None) + peaks = controller.get_peaks(demand_profile, n_override_events=1, override_events_period=None) actual_peak_times = peaks.loc[peaks["is_peak"], "date_time"].tolist() assert actual_peak_times == expected_peak_times @@ -90,7 +90,7 @@ def test_get_peaks_with_month_period_expected_peaks(): pd.Timestamp("2025-02-01 12:00:00"), ] - peaks = controller.get_peaks(demand_profile, n_max_events=1, max_events_period="M") + peaks = controller.get_peaks(demand_profile, n_override_events=1, override_events_period="M") actual_peak_times = peaks.loc[peaks["is_peak"], "date_time"].tolist() assert actual_peak_times == expected_peak_times @@ -110,7 +110,7 @@ def test_get_peaks_with_month_period_from_csv_expected_peaks(): expected_peak_times = pd.to_datetime(expected_peaks_df["time_mountain"]).to_list() - peaks = controller.get_peaks(demand_profile, n_max_events=10, max_events_period="M") + peaks = controller.get_peaks(demand_profile, n_override_events=10, override_events_period="M") actual_peak_times = pd.to_datetime(peaks.loc[peaks["is_peak"], "date_time"]).tolist() assert actual_peak_times == expected_peak_times @@ -125,8 +125,10 @@ def test_get_peaks_invalid_period_string_raises(): "demand": [1.0, 2.0, 3.0, 4.0], } - with pytest.raises(ValueError, match="Invalid max_events_period string"): - controller.get_peaks(demand_profile, n_max_events=1, max_events_period="not_a_period") + with pytest.raises(ValueError, match="Invalid override_events_period string"): + controller.get_peaks( + demand_profile, n_override_events=1, override_events_period="not_a_period" + ) @pytest.mark.unit @@ -198,8 +200,8 @@ def test_get_peaks_invalid_min_proximity_raises(): with pytest.raises(ValueError, match="Selected peaks violate min_proximity."): controller.get_peaks( demand_profile, - n_max_events=2, - max_events_period="W", + n_override_events=2, + override_events_period="W", min_proximity={"units": "D", "val": 1}, ) From 52f5e45f9b20868044205d116927b61586afe068 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 14:05:01 -0600 Subject: [PATCH 25/49] make example 33_peak_load_management run full 8760 --- .pre-commit-config.yaml | 2 +- .../demand_profiles/demand_profile.yaml | 8760 +++++++++++++++++ .../demand_profiles/demand_profile_2.yaml | 8760 +++++++++++++++++ .../33_peak_load_management/plant_config.yaml | 2 +- .../run_peak_load_management.py | 3 +- .../33_peak_load_management/tech_config.yaml | 6 +- h2integrate/core/inputs/validation.py | 15 +- 7 files changed, 17535 insertions(+), 13 deletions(-) create mode 100644 examples/33_peak_load_management/demand_profiles/demand_profile.yaml create mode 100644 examples/33_peak_load_management/demand_profiles/demand_profile_2.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a4a36609c..35a0a2e49 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,7 +27,7 @@ repos: - id: yamlfix # Exclude YAML files that are used as inputs for testing or examples, or ones for desired schedule in HOPP as they # expect misformatted YAML files. - exclude: ^(h2integrate/core/test/inputs/.*|examples/11_hybrid_energy_plant/tech_inputs/desired_schedules/.*|examples/33_hybrid_energy_plant/demand_profiles/.*)$ + exclude: ^(h2integrate/core/test/inputs/.*|examples/11_hybrid_energy_plant/tech_inputs/desired_schedules/.*|examples/33_peak_load_management/demand_profiles/.*)$ - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. rev: v0.8.1 diff --git a/examples/33_peak_load_management/demand_profiles/demand_profile.yaml b/examples/33_peak_load_management/demand_profiles/demand_profile.yaml new file mode 100644 index 000000000..6e4fc3236 --- /dev/null +++ b/examples/33_peak_load_management/demand_profiles/demand_profile.yaml @@ -0,0 +1,8760 @@ +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 +- 210 +- 196 +- 182 +- 168 +- 154 +- 161 +- 189 +- 238 +- 301 +- 399 +- 518 +- 686 +- 924 +- 1050 +- 1162 +- 1211 +- 1260 +- 1134 +- 938 +- 714 +- 546 +- 420 +- 322 +- 245 +- 182 +- 168 +- 154 +- 147 +- 140 +- 154 +- 182 +- 231 +- 287 +- 378 +- 490 +- 658 +- 882 +- 1148 +- 1106 +- 1022 +- 924 +- 770 +- 602 +- 476 +- 378 +- 301 +- 245 +- 203 +- 217 +- 203 +- 189 +- 168 +- 154 +- 168 +- 203 +- 252 +- 329 +- 434 +- 560 +- 742 +- 966 +- 1064 +- 1120 +- 1176 +- 1204 +- 1232 +- 1036 +- 826 +- 630 +- 490 +- 378 +- 280 +- 189 +- 175 +- 161 +- 147 +- 140 +- 154 +- 189 +- 245 +- 322 +- 420 +- 553 +- 756 +- 1183 +- 1134 +- 1078 +- 1022 +- 910 +- 784 +- 616 +- 483 +- 385 +- 308 +- 252 +- 210 +- 196 +- 182 +- 168 +- 154 +- 147 +- 161 +- 196 +- 259 +- 343 +- 455 +- 588 +- 784 +- 980 +- 1106 +- 1190 +- 1246 +- 1162 +- 1050 +- 882 +- 686 +- 532 +- 406 +- 308 +- 231 +- 210 +- 196 +- 182 +- 161 +- 147 +- 154 +- 182 +- 224 +- 280 +- 371 +- 483 +- 644 +- 896 +- 1092 +- 1211 +- 1155 +- 1029 +- 847 +- 651 +- 518 +- 413 +- 329 +- 266 +- 224 +- 203 +- 189 +- 175 +- 154 +- 140 +- 147 +- 175 +- 217 +- 273 +- 350 +- 462 +- 616 +- 868 +- 1064 +- 1197 +- 1113 +- 987 +- 826 +- 630 +- 504 +- 406 +- 322 +- 259 +- 217 diff --git a/examples/33_peak_load_management/demand_profiles/demand_profile_2.yaml b/examples/33_peak_load_management/demand_profiles/demand_profile_2.yaml new file mode 100644 index 000000000..ff147fa11 --- /dev/null +++ b/examples/33_peak_load_management/demand_profiles/demand_profile_2.yaml @@ -0,0 +1,8760 @@ +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 +- 380 +- 340 +- 310 +- 280 +- 260 +- 300 +- 420 +- 650 +- 980 +- 1475 +- 1380 +- 1200 +- 980 +- 860 +- 790 +- 720 +- 660 +- 610 +- 700 +- 880 +- 1090 +- 1030 +- 820 +- 600 +- 450 +- 410 +- 370 +- 330 +- 290 +- 260 +- 310 +- 390 +- 540 +- 710 +- 900 +- 1090 +- 1310 +- 1490 +- 1650 +- 1730 +- 1785 +- 1600 +- 1320 +- 1040 +- 820 +- 660 +- 560 +- 490 +- 300 +- 280 +- 250 +- 230 +- 220 +- 240 +- 290 +- 360 +- 440 +- 520 +- 610 +- 700 +- 820 +- 910 +- 980 +- 1020 +- 1080 +- 1150 +- 1230 +- 1290 +- 1330 +- 1360 +- 1180 +- 900 +- 410 +- 380 +- 340 +- 300 +- 270 +- 250 +- 290 +- 360 +- 500 +- 670 +- 860 +- 1080 +- 1420 +- 1695 +- 1580 +- 1430 +- 1270 +- 1080 +- 900 +- 740 +- 620 +- 540 +- 480 +- 430 +- 620 +- 700 +- 860 +- 1020 +- 1260 +- 1450 +- 1525 +- 1490 +- 1320 +- 1160 +- 980 +- 860 +- 760 +- 690 +- 640 +- 610 +- 700 +- 860 +- 1040 +- 1230 +- 1310 +- 1200 +- 980 +- 760 +- 470 +- 430 +- 390 +- 350 +- 310 +- 280 +- 320 +- 410 +- 560 +- 740 +- 930 +- 1140 +- 1360 +- 1550 +- 1710 +- 1800 +- 1680 +- 1440 +- 1180 +- 940 +- 760 +- 620 +- 540 +- 480 +- 430 +- 390 +- 360 +- 320 +- 280 +- 250 +- 300 +- 380 +- 520 +- 690 +- 860 +- 1040 +- 1260 +- 1480 +- 1610 +- 1520 +- 1340 +- 1110 +- 900 +- 760 +- 640 +- 560 +- 500 +- 460 diff --git a/examples/33_peak_load_management/plant_config.yaml b/examples/33_peak_load_management/plant_config.yaml index 95462eef5..cca0ccd9a 100644 --- a/examples/33_peak_load_management/plant_config.yaml +++ b/examples/33_peak_load_management/plant_config.yaml @@ -3,7 +3,7 @@ description: Demonstrates multivariable streams with a gas combiner plant: plant_life: 30 simulation: - n_timesteps: 168 + n_timesteps: 8760 dt: 3600 timezone: -6 start_time: 2025/07/01 00:00:00 diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index 3fc64b695..1e17db49a 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -26,6 +26,7 @@ "demand_profile_2" ] ) + secondary_demand = model.prob.get_val("battery.electricity_demand") time_series = build_time_series_from_plant_config(model.plant_config) @@ -45,7 +46,7 @@ ax[2].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[2].plot( time_plot, - model.prob.get_val("battery.electricity_out", units="MW"), + model.prob.get_val("battery.electricity_out", units="MW")[:n_plot], label="Battery charge/discharge", ) ax[2].set(ylabel="Power (MW)") diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index 43d5b4d68..1be371f13 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -12,8 +12,8 @@ technologies: shared_parameters: commodity: electricity commodity_rate_units: kW - max_charge_rate: 2500.0 # kW/time step, 1, 2.5, or 5 MW - max_capacity: 10000.0 # kWh, 10 MWh + max_charge_rate: 500.0 # kW + max_capacity: 2000.0 # kWh, 1 MWh max_soc_fraction: 0.9 # percent as decimal min_soc_fraction: 0.1 # percent as decimal init_soc_fraction: 0.9 # percent as decimal @@ -21,7 +21,7 @@ technologies: charge_efficiency: 1.0 # percent as decimal discharge_efficiency: 1.0 # percent as decimal control_parameters: - max_discharge_rate: 2500.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate + max_discharge_rate: 500.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate charge_equals_discharge: true # enforce symmetric charge and discharge power limits demand_profile_2: !include demand_profiles/demand_profile_2.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. dispatch_priority_demand_profile: demand_profile_2 # demand profile the controller prioritizes when deciding dispatch diff --git a/h2integrate/core/inputs/validation.py b/h2integrate/core/inputs/validation.py index 70083045c..3de820159 100644 --- a/h2integrate/core/inputs/validation.py +++ b/h2integrate/core/inputs/validation.py @@ -140,13 +140,14 @@ def load_tech_yaml(finput): def load_plant_yaml(finput): plant_config = _validate(finput, fschema_plant) - # if int(plant_config["plant"]["simulation"]["n_timesteps"]) != 8760: - # msg = ( - # "H2Integrate does not currently support simulations that are less than or " - # "greater than 1-year. Please ensure that " - # "plant_config['plant']['simulation']['n_timesteps'] is set to 8760." - # ) - # raise ValueError(msg) + if int(plant_config["plant"]["simulation"]["n_timesteps"]) != 8760: + msg = ( + "H2Integrate does not currently support simulations that are less than or " + "greater than 1-year. Please ensure that " + "plant_config['plant']['simulation']['n_timesteps'] is set to 8760." + ) + raise ValueError(msg) + if int(plant_config["plant"]["simulation"]["dt"]) != 3600: msg = ( "H2Integrate does not currently support simulations with a time step that is " From 797e1d6c8cad4a21d83718b55c04b34bf083dcc7 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 15:27:45 -0600 Subject: [PATCH 26/49] refine example 33 plot --- .../run_peak_load_management.py | 23 +++++++++++-------- .../33_peak_load_management/tech_config.yaml | 4 ++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index 1e17db49a..5e2145fca 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -34,14 +34,14 @@ n_plot = 24 * 7 time_plot = time_series[:n_plot] -fig, ax = plt.subplots(4, 1, sharex=True) +fig, ax = plt.subplots(4, 1, sharex=True, figsize=(10, 5)) ax[0].plot(time_plot, supervisor_demand[:n_plot] * 1e-3, label="Overriding demand (MW)") ax[0].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") -ax[0].set_ylabel("Power (MW)") -ax[0].legend(loc="upper right") +ax[0].set(ylabel="Power (MW)", ylim=[-2, 2]) +ax[0].legend(frameon=False, ncol=2) ax[1].plot(time_plot, model.prob.get_val("battery.SOC", units="percent")[:n_plot]) -ax[1].set(ylabel="SOC") +ax[1].set(ylabel="SOC", ylim=[0, 100]) ax[2].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[2].plot( @@ -49,8 +49,8 @@ model.prob.get_val("battery.electricity_out", units="MW")[:n_plot], label="Battery charge/discharge", ) -ax[2].set(ylabel="Power (MW)") -ax[2].legend() +ax[2].set(ylabel="Power (MW)", ylim=[-2, 2]) +ax[2].legend(frameon=False, ncol=2) ax[3].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[3].plot( @@ -58,9 +58,14 @@ model.prob.get_val("battery.unmet_electricity_demand_out", units="MW")[:n_plot], label="New demand profile", ) -ax[3].set(ylabel="Power (MW)") -ax[3].legend() +ax[3].set(ylabel="Power (MW)", ylim=[-2, 2]) +ax[3].legend(frameon=False, ncol=2) ax[3].tick_params(axis="x", labelrotation=90) +for axis in ax: + axis.minorticks_on() + axis.grid(True, which="major", alpha=0.45, linewidth=0.8) + axis.grid(True, which="minor", alpha=0.2, linewidth=0.5) + plt.tight_layout() -plt.show() +plt.savefig("example_peak_load_dispatch.pdf", transparent=True) diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index 1be371f13..28e0a3909 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -25,14 +25,14 @@ technologies: charge_equals_discharge: true # enforce symmetric charge and discharge power limits demand_profile_2: !include demand_profiles/demand_profile_2.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. dispatch_priority_demand_profile: demand_profile_2 # demand profile the controller prioritizes when deciding dispatch - n_override_events: 2 # maximum number of peak events from the priority demand profile that the controller will respond to within each event period + n_override_events: 3 # maximum number of peak events from the priority demand profile that the controller will respond to within each event period override_events_period: W # pandas-style period code for resetting event counts; W means per week, M means month, etc peak_range: start: 12:00:00 # start of the preferred daily peak-shaving window end: 17:00:00 # end of the preferred daily peak-shaving window advance_discharge_period: units: h # time units applied to the advance-discharge offset - val: 2 # begin discharging this far ahead of the detected peak + val: 1 # begin discharging this far ahead of the detected peak delay_charge_period: units: h # time units applied to the charge-delay offset val: 4 # wait this long after the peak window before recharging From 830b6ee43740254439c70af44d26814ec95579bc Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 16:26:57 -0600 Subject: [PATCH 27/49] fix color coordination in plot for peak load example 33 and remove debug statement from test_utilities.py --- examples/33_peak_load_management/run_peak_load_management.py | 2 +- h2integrate/core/test/test_utilities.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index 5e2145fca..4212a5b40 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -35,8 +35,8 @@ time_plot = time_series[:n_plot] fig, ax = plt.subplots(4, 1, sharex=True, figsize=(10, 5)) -ax[0].plot(time_plot, supervisor_demand[:n_plot] * 1e-3, label="Overriding demand (MW)") ax[0].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") +ax[0].plot(time_plot, supervisor_demand[:n_plot] * 1e-3, label="Overriding demand (MW)") ax[0].set(ylabel="Power (MW)", ylim=[-2, 2]) ax[0].legend(frameon=False, ncol=2) diff --git a/h2integrate/core/test/test_utilities.py b/h2integrate/core/test/test_utilities.py index 879dec681..7a9df774e 100644 --- a/h2integrate/core/test/test_utilities.py +++ b/h2integrate/core/test/test_utilities.py @@ -574,7 +574,5 @@ def test_build_time_series_from_plant_config(): "2025-01-01 08:30:00+00:00", ] ).to_pydatetime() - import pdb - pdb.set_trace() assert (ts == expected).all() From dfe838074bf2c2babe28d6219daadd0ff24de181 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 16:49:42 -0600 Subject: [PATCH 28/49] improve code reuse --- .../demand_openloop_storage_controller.py | 28 +--------- .../storage/openloop_storage_control_base.py | 38 +++++++++++++ .../plm_openloop_storage_controller.py | 55 +++---------------- 3 files changed, 46 insertions(+), 75 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py index 6fc9cfab9..69be664cc 100644 --- a/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py @@ -77,33 +77,7 @@ def __attrs_post_init__(self): """ super().__attrs_post_init__() - if (self.round_trip_efficiency is not None) and ( - self.charge_efficiency is None and self.discharge_efficiency is None - ): - # Calculate charge and discharge efficiencies from round-trip efficiency - self.charge_efficiency = np.sqrt(self.round_trip_efficiency) - self.discharge_efficiency = np.sqrt(self.round_trip_efficiency) - self.round_trip_efficiency = None - if self.charge_efficiency is None or self.discharge_efficiency is None: - raise ValueError( - "Exactly one of the following sets of parameters must be set: (a) " - "`round_trip_efficiency`, or (b) both `charge_efficiency` " - "and `discharge_efficiency`." - ) - - if self.charge_equals_discharge: - if ( - self.max_discharge_rate is not None - and self.max_discharge_rate != self.max_charge_rate - ): - msg = ( - "Max discharge rate does not equal max charge rate but charge_equals_discharge " - f"is True. Discharge rate is {self.max_discharge_rate} and charge rate " - f"is {self.max_charge_rate}." - ) - raise ValueError(msg) - - self.max_discharge_rate = self.max_charge_rate + self.common_post_init_operations() class DemandOpenLoopStorageController(StorageOpenLoopControlBase): diff --git a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py index 744363ad8..4ceff7bff 100644 --- a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py +++ b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py @@ -1,3 +1,4 @@ +import numpy as np import openmdao.api as om from attrs import field, define @@ -30,6 +31,43 @@ def __attrs_post_init__(self): if self.commodity_amount_units is None: self.commodity_amount_units = f"({self.commodity_rate_units})*h" + def common_post_init_operations(self): + """ + Post-initialization logic to validate and calculate efficiencies. + + Ensures that either `charge_efficiency` and `discharge_efficiency` are provided, + or `round_trip_efficiency` is provided. If `round_trip_efficiency` is provided, + it calculates `charge_efficiency` and `discharge_efficiency` as the square root + of `round_trip_efficiency`. + """ + if (self.round_trip_efficiency is not None) and ( + self.charge_efficiency is None and self.discharge_efficiency is None + ): + # Calculate charge and discharge efficiencies from round-trip efficiency + self.charge_efficiency = np.sqrt(self.round_trip_efficiency) + self.discharge_efficiency = np.sqrt(self.round_trip_efficiency) + self.round_trip_efficiency = None + if self.charge_efficiency is None or self.discharge_efficiency is None: + raise ValueError( + "Exactly one of the following sets of parameters must be set: (a) " + "`round_trip_efficiency`, or (b) both `charge_efficiency` " + "and `discharge_efficiency`." + ) + + if self.charge_equals_discharge: + if ( + self.max_discharge_rate is not None + and self.max_discharge_rate != self.max_charge_rate + ): + msg = ( + "Max discharge rate does not equal max charge rate but charge_equals_discharge " + f"is True. Discharge rate is {self.max_discharge_rate} and charge rate " + f"is {self.max_charge_rate}." + ) + raise ValueError(msg) + + self.max_discharge_rate = self.max_charge_rate + class StorageOpenLoopControlBase(om.ExplicitComponent): """Base OpenMDAO component for open-loop demand tracking. diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index d66c0dd50..8707bb152 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -129,42 +129,9 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa ) def __attrs_post_init__(self): - """ - Post-initialization logic to validate and calculate efficiencies. - - Ensures that either `charge_efficiency` and `discharge_efficiency` are provided, - or `round_trip_efficiency` is provided. If `round_trip_efficiency` is provided, - it calculates `charge_efficiency` and `discharge_efficiency` as the square root - of `round_trip_efficiency`. - """ super().__attrs_post_init__() - if (self.round_trip_efficiency is not None) and ( - self.charge_efficiency is None and self.discharge_efficiency is None - ): - # Calculate charge and discharge efficiencies from round-trip efficiency - self.charge_efficiency = np.sqrt(self.round_trip_efficiency) - self.discharge_efficiency = np.sqrt(self.round_trip_efficiency) - self.round_trip_efficiency = None - if self.charge_efficiency is None or self.discharge_efficiency is None: - raise ValueError( - "Exactly one of the following sets of parameters must be set: (a) " - "`round_trip_efficiency`, or (b) both `charge_efficiency` " - "and `discharge_efficiency`." - ) - - if self.charge_equals_discharge: - if ( - self.max_discharge_rate is not None - and self.max_discharge_rate != self.max_charge_rate - ): - msg = ( - "Max discharge rate does not equal max charge rate but charge_equals_discharge " - f"is True. Discharge rate is {self.max_discharge_rate} and charge rate " - f"is {self.max_charge_rate}." - ) - raise ValueError(msg) - self.max_discharge_rate = self.max_charge_rate + self.common_post_init_operations() # Validate and normalize dict parameters # peak_range: must have 'start' and 'end' keys as HH:MM:SS strings. @@ -379,12 +346,6 @@ def compute(self, inputs, outputs): * ``_set_point``: Dispatch command to storage, negative when charging, positive when discharging. - Control logic includes: - * Enforcing SOC limits (min, max, and initial conditions). - * Applying charge and discharge efficiencies. - * Observing charge/discharge rate limits. - * Tracking energy shortfalls and excesses at each time step. - Raises: UserWarning: If the demand profile is entirely zero. UserWarning: If ``max_charge_rate`` or ``max_capacity`` is negative. @@ -472,8 +433,8 @@ def compute(self, inputs, outputs): last_discharge = self.peaks_df["date_time"].iloc[0] - delay_charge_period # Process each timestep using the pre-computed peak schedule - for i, _demand_t in enumerate(self.peaks_df["demand"].tolist()): - td = self.peaks_df["date_time"].iloc[i] + for i in range(self.n_timesteps): + time_stamp = self.peaks_df["date_time"].iloc[i] time_to_peak = self.peaks_df["time_to_peak"].iloc[i] # Get the input flow at the current time step @@ -490,13 +451,14 @@ def compute(self, inputs, outputs): if not discharging and soc < soc_max: if self.peaks_df["allow_charge"].iloc[i]: - if (td - last_discharge) > delay_charge_period: + if (time_stamp - last_discharge) > delay_charge_period: charging = True discharging = False if discharging: # DISCHARGE MODE: Supply commodity to meet peak demand - # Note: discharge_needed is internal (storage view), max_discharge_rate is external + # Note: available_discharge is internal (storage view), + # max_discharge_rate is external discharge = min(available_discharge, max_discharge_rate / discharge_eff) soc -= discharge / max_capacity # Deplete storage state of charge @@ -505,13 +467,10 @@ def compute(self, inputs, outputs): # Mark discharge completion time for charging delay calculation if soc <= soc_min: - last_discharge = td + last_discharge = time_stamp elif charging: # CHARGE MODE: Store commodity by charging from assumed infinite source - # unused_input is external (delivered commodity not needed for demand) - # unused_input = input_flow - demand_t - # unused_input = unused_input.item() # `charge` is as seen by the storage, but the things being compared should all be as # seen outside the storage so we need to adjust `available_charge` outside the # storage view and the final result back into the storage view. From 9c0b2129c96d7ec32254fc848cd95507e1f95722 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 17:01:08 -0600 Subject: [PATCH 29/49] added common compute checks to baseclass --- .../demand_openloop_storage_controller.py | 17 ++----------- .../storage/openloop_storage_control_base.py | 17 +++++++++++++ .../plm_openloop_storage_controller.py | 25 +++++-------------- 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py index 69be664cc..c22adbb80 100644 --- a/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py @@ -158,21 +158,8 @@ def compute(self, inputs, outputs): None """ commodity = self.config.commodity - if np.all(inputs[f"{commodity}_demand"] == 0.0): - msg = "Demand profile is zero, check that demand profile is input" - raise UserWarning(msg) - if inputs["max_charge_rate"][0] < 0: - msg = ( - f"max_charge_rate cannot be less than zero and has value of " - f"{inputs['max_charge_rate']}" - ) - raise UserWarning(msg) - if inputs["storage_capacity"][0] < 0: - msg = ( - f"storage_capacity cannot be less than zero and has value of " - f"{inputs['storage_capacity']}" - ) - raise UserWarning(msg) + + self.common_checks_needed_in_compute(inputs) max_capacity = inputs["storage_capacity"].item() max_charge_rate = inputs["max_charge_rate"].item() diff --git a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py index 4ceff7bff..655f6178e 100644 --- a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py +++ b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py @@ -121,3 +121,20 @@ def compute(): NotImplementedError: Always, unless implemented in a subclass. """ raise NotImplementedError("This method should be implemented in a subclass.") + + def common_checks_needed_in_compute(self, inputs): + if np.all(inputs[f"{self.config.commodity}_demand"] == 0.0): + msg = "Demand profile is zero, check that demand profile is input" + raise UserWarning(msg) + if inputs["max_charge_rate"][0] < 0: + msg = ( + f"max_charge_rate cannot be less than zero and has value of " + f"{inputs['max_charge_rate']}" + ) + raise UserWarning(msg) + if inputs["storage_capacity"][0] < 0: + msg = ( + f"storage_capacity cannot be less than zero and has value of " + f"{inputs['storage_capacity']}" + ) + raise UserWarning(msg) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 8707bb152..566d08514 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -354,31 +354,18 @@ def compute(self, inputs, outputs): None """ - commodity = self.config.commodity - if np.all(inputs[f"{commodity}_demand"] == 0.0): - msg = "Demand profile is zero, check that demand profile is input" - raise UserWarning(msg) - if inputs["max_charge_rate"][0] < 0: - msg = ( - f"max_charge_rate cannot be less than zero and has value of " - f"{inputs['max_charge_rate']}" - ) - raise UserWarning(msg) - if inputs["storage_capacity"][0] < 0: - msg = ( - f"storage_capacity cannot be less than zero and has value of " - f"{inputs['storage_capacity']}" - ) - raise UserWarning(msg) + self.common_checks_needed_in_compute(inputs) - max_capacity = inputs["storage_capacity"].item() - max_charge_rate = inputs["max_charge_rate"].item() + commodity = self.config.commodity if self.config.charge_equals_discharge: max_discharge_rate = inputs["max_charge_rate"].item() else: max_discharge_rate = inputs["max_discharge_rate"].item() + max_capacity = inputs["storage_capacity"].item() + max_charge_rate = inputs["max_charge_rate"].item() + soc_max = self.config.max_soc_fraction soc_min = self.config.min_soc_fraction init_soc_fraction = self.config.init_soc_fraction @@ -388,7 +375,7 @@ def compute(self, inputs, outputs): # Build timestamped demand dictionaries from simulation timeline. demand_profile = self._build_demand_profile_dict( - inputs[f"{self.config.commodity}_demand"], + inputs[f"{commodity}_demand"], self.time_index, ) From 7cbfe2f733fe20f1c0fe8e93265e60d6478d32ed Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 17:37:26 -0600 Subject: [PATCH 30/49] move input file contents to fixture --- .../storage/openloop_storage_control_base.py | 11 ++++ .../test_plm_openloop_storage_controller.py | 52 ++++++++++++++----- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py index 655f6178e..a255ef88b 100644 --- a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py +++ b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py @@ -27,6 +27,17 @@ class StorageOpenLoopControlBaseConfig(BaseConfig): demand_profile: int | float | list | dict = field() commodity_amount_units: str = field(default=None) + # max_capacity: float = field() + # max_soc_fraction: float = field(validator=range_val(0, 1)) + # min_soc_fraction: float = field(validator=range_val(0, 1)) + # init_soc_fraction: float = field(validator=range_val(0, 1)) + # max_charge_rate: float = field(validator=gte_zero) + # charge_equals_discharge: bool = field(default=True) + # max_discharge_rate: float | None = field(default=None) + # charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + # discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + # round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + def __attrs_post_init__(self): if self.commodity_amount_units is None: self.commodity_amount_units = f"({self.commodity_rate_units})*h" diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 0662711d6..6d0e08b0b 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -5,15 +5,45 @@ import pandas as pd import pytest import openmdao.api as om +from pytest import fixture -from h2integrate.core.file_utils import load_yaml from h2integrate.storage.storage_performance_model import StoragePerformanceModel from h2integrate.control.control_strategies.storage.plm_openloop_storage_controller import ( PeakLoadManagementOpenLoopStorageController, ) -# from datetime import time +@fixture +def tech_config_base(): + """Base technology configuration fixture for storage controller tests.""" + tech_config_dict = { + "name": "technology_config", + "description": "This hybrid plant produces hydrogen", + "technologies": { + "h2_storage": { + "control_strategy": { + "model": "SimpleStorageOpenLoopController", + }, + "performance_model": { + "model": "StorageAutoSizingModel", + }, + "cost_model": { + "model": "LinedRockCavernStorageCostModel", + }, + "model_inputs": { + "shared_parameters": { + "commodity": "hydrogen", + "commodity_rate_units": "kg/h", + }, + "cost_parameters": { + "sizing_mode": "auto", + }, + }, + }, + }, + } + + return tech_config_dict def _controller_without_setup(): @@ -415,13 +445,11 @@ def test_get_allowed_charge_blocks_charge_inside_peak_range(subtests): @pytest.mark.regression -def test_plm_controller_basic_discharge_before_peak(subtests): +def test_plm_controller_basic_discharge_before_peak(subtests, tech_config_base): """Test PLM controller discharges before detected peak and charges after.""" - current_dir = Path(__file__).parent # Load base tech config - tech_config_path = current_dir / "inputs" / "tech_config.yaml" - tech_config = load_yaml(tech_config_path) + tech_config = tech_config_base # Configure PLM-specific parameters tech_config["technologies"]["h2_storage"]["model_inputs"]["shared_parameters"] = { @@ -514,11 +542,9 @@ def test_plm_controller_basic_discharge_before_peak(subtests): @pytest.mark.regression -def test_plm_controller_respects_soc_bounds(subtests): +def test_plm_controller_respects_soc_bounds(subtests, tech_config_base): """Test PLM controller respects min/max SOC constraints.""" - current_dir = Path(__file__).parent - tech_config_path = current_dir / "inputs" / "tech_config.yaml" - tech_config = load_yaml(tech_config_path) + tech_config = tech_config_base tech_config["technologies"]["h2_storage"]["model_inputs"]["shared_parameters"] = { "commodity": "hydrogen", @@ -597,11 +623,9 @@ def test_plm_controller_respects_soc_bounds(subtests): @pytest.mark.regression -def test_plm_controller_blocking_charge_in_peak_range(subtests): +def test_plm_controller_blocking_charge_in_peak_range(subtests, tech_config_base): """Test PLM controller blocks charging during peak window when configured.""" - current_dir = Path(__file__).parent - tech_config_path = current_dir / "inputs" / "tech_config.yaml" - tech_config = load_yaml(tech_config_path) + tech_config = tech_config_base peak_window_start = "10:00:00" peak_window_end = "14:00:00" From 725838bee00499fb724103686901a0e3103f319b Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 17:48:49 -0600 Subject: [PATCH 31/49] add storage parameters to baseclass but optional --- .../demand_openloop_storage_controller.py | 49 +---------- .../storage/openloop_storage_control_base.py | 83 ++++++++++++++++--- .../plm_openloop_storage_controller.py | 40 +-------- 3 files changed, 76 insertions(+), 96 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py index c22adbb80..2041d4e0c 100644 --- a/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/demand_openloop_storage_controller.py @@ -1,10 +1,9 @@ from copy import deepcopy import numpy as np -from attrs import field, define +from attrs import define from h2integrate.core.utilities import merge_shared_inputs -from h2integrate.core.validators import gte_zero, range_val, range_val_or_none from h2integrate.control.control_strategies.storage.openloop_storage_control_base import ( StorageOpenLoopControlBase, StorageOpenLoopControlBaseConfig, @@ -18,53 +17,9 @@ class DemandOpenLoopStorageControllerConfig(StorageOpenLoopControlBaseConfig): This class defines the parameters required to configure the `DemandOpenLoopStorageController`. - Attributes: - commodity (str): Name of the commodity being controlled - (e.g., "hydrogen"). Stripped of whitespace. - commodity_rate_units (str): Units of the commodity (e.g., "kg/h"). - demand_profile (int | float | list): Demand values for each timestep, in - the same units as `commodity_rate_units`. May be a scalar for constant - demand or a list/array for time-varying demand. - max_capacity (float): Maximum storage capacity of the commodity (in non-rate units, - e.g., "kg" if `commodity_rate_units` is "kg/h"). - max_soc_fraction (float): Maximum allowable state of charge (SOC) as a fraction - of `max_capacity`, between 0 and 1. - min_soc_fraction (float): Minimum allowable SOC as a fraction of `max_capacity`, - between 0 and 1. - init_soc_fraction (float): Initial SOC as a fraction of `max_capacity`, - between 0 and 1. - max_charge_rate (float): Maximum rate at which the commodity can be charged (in units - per time step, e.g., "kg/time step"). This rate does not include the charge_efficiency. - charge_equals_discharge (bool, optional): If True, set the max_discharge_rate equal to the - max_charge_rate. If False, specify the max_discharge_rate as a value different than - the max_charge_rate. Defaults to True. - max_discharge_rate (float | None, optional): Maximum rate at which the commodity can be - discharged (in units per time step, e.g., "kg/time step"). This rate does not include - the discharge_efficiency. Only required if `charge_equals_discharge` is False. - charge_efficiency (float | None, optional): Efficiency of charging the storage, represented - as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if - `round_trip_efficiency` is provided. - discharge_efficiency (float | None, optional): Efficiency of discharging the storage, - represented as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if - `round_trip_efficiency` is provided. - round_trip_efficiency (float | None, optional): Combined efficiency of charging and - discharging the storage, represented as a decimal between 0 and 1 (e.g., 0.81 for - 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are - provided. - commodity_amount_units (str | None, optional): Units of the commodity as an amount - (i.e., kW*h or kg). If not provided, defaults to commodity_rate_units*h. """ - max_capacity: float = field() - max_soc_fraction: float = field(validator=range_val(0, 1)) - min_soc_fraction: float = field(validator=range_val(0, 1)) - init_soc_fraction: float = field(validator=range_val(0, 1)) - max_charge_rate: float = field(validator=gte_zero) - charge_equals_discharge: bool = field(default=True) - max_discharge_rate: float | None = field(default=None) - charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + require_storage_parameters = True def __attrs_post_init__(self): """ diff --git a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py index a255ef88b..acd45b936 100644 --- a/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py +++ b/h2integrate/control/control_strategies/storage/openloop_storage_control_base.py @@ -1,8 +1,11 @@ +from typing import ClassVar + import numpy as np import openmdao.api as om -from attrs import field, define +from attrs import field, define, validators from h2integrate.core.utilities import BaseConfig +from h2integrate.core.validators import gte_zero, range_val_or_none @define(kw_only=True) @@ -19,7 +22,38 @@ class StorageOpenLoopControlBaseConfig(BaseConfig): it should have two keys: "time_date" and "demand". commodity_amount_units (str | None, optional): Units of the commodity as an amount (i.e., kW*h or kg). If not provided, defaults to `commodity_rate_units*h`. - + require_storage_parameters (ClassVar[bool]): Class-level flag used by child config + classes to require storage sizing and efficiency parameters. Leave False for + controllers that do not need storage-specific fields. Set to True in child + config classes that require optional attributes. + + Optional Attributes: + max_capacity (float): Maximum storage capacity of the commodity (in non-rate units, + e.g., "kg" if `commodity_rate_units` is "kg/h"). + max_soc_fraction (float): Maximum allowable state of charge (SOC) as a fraction + of `max_capacity`, between 0 and 1. + min_soc_fraction (float): Minimum allowable SOC as a fraction of `max_capacity`, + between 0 and 1. + init_soc_fraction (float): Initial SOC as a fraction of `max_capacity`, + between 0 and 1. + max_charge_rate (float): Maximum rate at which the commodity can be charged (in units + per time step, e.g., "kg/time step"). This rate does not include the charge_efficiency. + charge_equals_discharge (bool, optional): If True, set the max_discharge_rate equal to the + max_charge_rate. If False, specify the max_discharge_rate as a value different than + the max_charge_rate. Defaults to True. + max_discharge_rate (float | None, optional): Maximum rate at which the commodity can be + discharged (in units per time step, e.g., "kg/time step"). This rate does not include + the discharge_efficiency. Only required if `charge_equals_discharge` is False. + charge_efficiency (float | None, optional): Efficiency of charging the storage, represented + as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if + `round_trip_efficiency` is provided. + discharge_efficiency (float | None, optional): Efficiency of discharging the storage, + represented as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if + `round_trip_efficiency` is provided. + round_trip_efficiency (float | None, optional): Combined efficiency of charging and + discharging the storage, represented as a decimal between 0 and 1 (e.g., 0.81 for + 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are + provided. """ commodity: str = field() @@ -27,21 +61,46 @@ class StorageOpenLoopControlBaseConfig(BaseConfig): demand_profile: int | float | list | dict = field() commodity_amount_units: str = field(default=None) - # max_capacity: float = field() - # max_soc_fraction: float = field(validator=range_val(0, 1)) - # min_soc_fraction: float = field(validator=range_val(0, 1)) - # init_soc_fraction: float = field(validator=range_val(0, 1)) - # max_charge_rate: float = field(validator=gte_zero) - # charge_equals_discharge: bool = field(default=True) - # max_discharge_rate: float | None = field(default=None) - # charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - # discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - # round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + # Child classes can set this to True to require the storage sizing/efficiency fields. + require_storage_parameters: ClassVar[bool] = False + + max_capacity: float | None = field(default=None) + max_soc_fraction: float | None = field(default=None, validator=range_val_or_none(0, 1)) + min_soc_fraction: float | None = field(default=None, validator=range_val_or_none(0, 1)) + init_soc_fraction: float | None = field(default=None, validator=range_val_or_none(0, 1)) + max_charge_rate: float | None = field(default=None, validator=validators.optional(gte_zero)) + charge_equals_discharge: bool = field(default=True) + max_discharge_rate: float | None = field(default=None) + charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) def __attrs_post_init__(self): if self.commodity_amount_units is None: self.commodity_amount_units = f"({self.commodity_rate_units})*h" + if self.require_storage_parameters: + self._validate_required_storage_parameters() + + def _validate_required_storage_parameters(self): + required_param_names = [ + "max_capacity", + "max_soc_fraction", + "min_soc_fraction", + "init_soc_fraction", + "max_charge_rate", + ] + missing = [name for name in required_param_names if getattr(self, name) is None] + if missing: + raise ValueError( + "Missing required storage configuration parameter(s): " f"{', '.join(missing)}" + ) + + if not self.charge_equals_discharge and self.max_discharge_rate is None: + raise ValueError( + "max_discharge_rate must be provided when charge_equals_discharge is False." + ) + def common_post_init_operations(self): """ Post-initialization logic to validate and calculate efficiencies. diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 566d08514..40ef42dd9 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -6,7 +6,7 @@ from attrs import field, define from h2integrate.core.utilities import merge_shared_inputs, build_time_series_from_plant_config -from h2integrate.core.validators import contains, gte_zero, range_val, range_val_or_none +from h2integrate.core.validators import contains from h2integrate.control.control_strategies.storage.openloop_storage_control_base import ( StorageOpenLoopControlBase, StorageOpenLoopControlBaseConfig, @@ -22,32 +22,6 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa pre-compute an open-loop discharge and recharge schedule. Attributes: - max_capacity (float): Maximum storage capacity of the commodity (in non-rate units, - e.g., "kg" if `commodity_rate_units` is "kg/h"). - max_soc_fraction (float): Maximum allowable state of charge (SOC) as a fraction - of `max_capacity`, between 0 and 1. - min_soc_fraction (float): Minimum allowable SOC as a fraction of `max_capacity`, - between 0 and 1. - init_soc_fraction (float): Initial SOC as a fraction of `max_capacity`, - between 0 and 1. - max_charge_rate (float): Maximum rate at which the commodity can be charged (in units - per time, e.g., "kg/h"). This rate does not include the charge_efficiency. - charge_equals_discharge (bool, optional): If True, set the max_discharge_rate equal to the - max_charge_rate. If False, specify the max_discharge_rate as a value different than - the max_charge_rate. Defaults to True. - max_discharge_rate (float | None, optional): Maximum rate at which the commodity can be - discharged (in units per time, e.g., "kg/h"). This rate does not include - the discharge_efficiency. Only required if `charge_equals_discharge` is False. - charge_efficiency (float | None, optional): Efficiency of charging the storage, represented - as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if - `round_trip_efficiency` is provided. - discharge_efficiency (float | None, optional): Efficiency of discharging the storage, - represented as a decimal between 0 and 1 (e.g., 0.9 for 90% efficiency). Optional if - `round_trip_efficiency` is provided. - round_trip_efficiency (float | None, optional): Combined efficiency of charging and - discharging the storage, represented as a decimal between 0 and 1 (e.g., 0.81 for - 81% efficiency). Optional if `charge_efficiency` and `discharge_efficiency` are - provided. demand_profile_2 (int | float | list | None, optional): Demand values for additional connected system for each timestep, in the same units as `commodity_rate_units`. May be a scalar for constant demand or a list/array for @@ -82,16 +56,8 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa """ - max_capacity: float = field() - max_soc_fraction: float = field(validator=range_val(0, 1)) - min_soc_fraction: float = field(validator=range_val(0, 1)) - init_soc_fraction: float = field(validator=range_val(0, 1)) - max_charge_rate: float = field(validator=gte_zero) - charge_equals_discharge: bool = field(default=True) - max_discharge_rate: float | None = field(default=None) - charge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - discharge_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) - round_trip_efficiency: float | None = field(default=None, validator=range_val_or_none(0, 1)) + require_storage_parameters = True + demand_profile_2: int | float | list | None = field() dispatch_priority_demand_profile: str = field( validator=contains(["demand_profile", "demand_profile_2"]), From 55d6d7a41673805632468d16fed2731300d167dd Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Thu, 9 Apr 2026 17:57:29 -0600 Subject: [PATCH 32/49] create plant_config fixture --- .../test_plm_openloop_storage_controller.py | 62 ++++++++----------- 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 6d0e08b0b..d40154025 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -46,6 +46,23 @@ def tech_config_base(): return tech_config_dict +@fixture +def plant_config_base(): + plant_config = { + "plant": { + "plant_life": 30, + "simulation": { + "n_timesteps": 24, + "dt": 3600, + "timezone": 0, + "start_time": "01/01/2000 00:00:00", + }, + } + } + + return plant_config + + def _controller_without_setup(): """Create a controller instance for testing pure helper methods.""" return object.__new__(PeakLoadManagementOpenLoopStorageController) @@ -445,7 +462,7 @@ def test_get_allowed_charge_blocks_charge_inside_peak_range(subtests): @pytest.mark.regression -def test_plm_controller_basic_discharge_before_peak(subtests, tech_config_base): +def test_plm_controller_basic_discharge_before_peak(subtests, tech_config_base, plant_config_base): """Test PLM controller discharges before detected peak and charges after.""" # Load base tech config @@ -480,17 +497,7 @@ def test_plm_controller_basic_discharge_before_peak(subtests, tech_config_base): "PeakLoadManagementOpenLoopStorageController" ) - plant_config = { - "plant": { - "plant_life": 30, - "simulation": { - "n_timesteps": 24, - "dt": 3600, - "timezone": 0, - "start_time": "01/01/2000 00:00:00", - }, - } - } + plant_config = plant_config_base # Set up OpenMDAO problem prob = om.Problem() @@ -542,7 +549,7 @@ def test_plm_controller_basic_discharge_before_peak(subtests, tech_config_base): @pytest.mark.regression -def test_plm_controller_respects_soc_bounds(subtests, tech_config_base): +def test_plm_controller_respects_soc_bounds(subtests, tech_config_base, plant_config_base): """Test PLM controller respects min/max SOC constraints.""" tech_config = tech_config_base @@ -572,17 +579,8 @@ def test_plm_controller_respects_soc_bounds(subtests, tech_config_base): "PeakLoadManagementOpenLoopStorageController" ) - plant_config = { - "plant": { - "plant_life": 30, - "simulation": { - "n_timesteps": 12, - "dt": 3600, - "timezone": 0, - "start_time": "01/01/2000 00:00:00", - }, - } - } + plant_config = plant_config_base + plant_config["plant"]["simulation"]["n_timesteps"] = 12 prob = om.Problem() @@ -623,7 +621,9 @@ def test_plm_controller_respects_soc_bounds(subtests, tech_config_base): @pytest.mark.regression -def test_plm_controller_blocking_charge_in_peak_range(subtests, tech_config_base): +def test_plm_controller_blocking_charge_in_peak_range( + subtests, tech_config_base, plant_config_base +): """Test PLM controller blocks charging during peak window when configured.""" tech_config = tech_config_base @@ -656,17 +656,7 @@ def test_plm_controller_blocking_charge_in_peak_range(subtests, tech_config_base "PeakLoadManagementOpenLoopStorageController" ) - plant_config = { - "plant": { - "plant_life": 30, - "simulation": { - "n_timesteps": 24, - "dt": 3600, - "timezone": 0, - "start_time": "01/01/2000 00:00:00", - }, - } - } + plant_config = plant_config_base prob = om.Problem() From b5689a4434dca8a94c8c1245fbb4a4370b0b2fd3 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Fri, 10 Apr 2026 09:02:46 -0600 Subject: [PATCH 33/49] complete and refine example 33 peak load --- .../demand_profiles/demand_profile.yaml | 17350 ++++++++-------- .../run_peak_load_management.py | 44 +- .../33_peak_load_management/tech_config.yaml | 8 +- 3 files changed, 8716 insertions(+), 8686 deletions(-) diff --git a/examples/33_peak_load_management/demand_profiles/demand_profile.yaml b/examples/33_peak_load_management/demand_profiles/demand_profile.yaml index 6e4fc3236..655da28d6 100644 --- a/examples/33_peak_load_management/demand_profiles/demand_profile.yaml +++ b/examples/33_peak_load_management/demand_profiles/demand_profile.yaml @@ -1,8760 +1,8760 @@ -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 - 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 +- 462 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 +- 504 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 +- 252 +- 336 +- 420 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 +- 90 +- 84 +- 78 +- 72 +- 66 +- 69 +- 81 +- 102 +- 129 +- 171 +- 222 +- 294 +- 396 +- 450 +- 498 +- 519 +- 540 +- 486 +- 402 +- 306 +- 234 +- 180 +- 138 +- 105 +- 78 +- 72 +- 66 +- 63 +- 60 +- 66 +- 78 +- 99 +- 123 +- 162 +- 210 +- 282 +- 378 +- 492 +- 474 +- 438 +- 396 +- 330 +- 258 +- 204 +- 162 +- 129 +- 105 +- 87 +- 93 +- 87 +- 81 +- 72 +- 66 +- 72 +- 87 +- 108 +- 141 +- 186 +- 240 +- 318 +- 414 +- 456 +- 480 - 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 -- 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 -- 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 +- 516 +- 528 +- 444 +- 354 +- 270 +- 210 +- 162 +- 120 +- 81 +- 75 +- 69 +- 63 +- 60 +- 66 +- 81 +- 105 +- 138 +- 180 +- 237 +- 324 +- 507 +- 486 - 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 -- 210 -- 196 -- 182 -- 168 -- 154 -- 161 -- 189 -- 238 -- 301 -- 399 -- 518 -- 686 -- 924 -- 1050 -- 1162 -- 1211 -- 1260 -- 1134 -- 938 -- 714 -- 546 -- 420 -- 322 -- 245 -- 182 -- 168 -- 154 -- 147 -- 140 -- 154 -- 182 -- 231 -- 287 -- 378 -- 490 -- 658 -- 882 -- 1148 -- 1106 -- 1022 -- 924 -- 770 -- 602 -- 476 -- 378 -- 301 -- 245 -- 203 -- 217 -- 203 -- 189 -- 168 -- 154 -- 168 -- 203 +- 438 +- 390 +- 336 +- 264 +- 207 +- 165 +- 132 +- 108 +- 90 +- 84 +- 78 +- 72 +- 66 +- 63 +- 69 +- 84 +- 111 +- 147 +- 195 - 252 -- 329 -- 434 -- 560 -- 742 -- 966 -- 1064 -- 1120 -- 1176 -- 1204 -- 1232 -- 1036 -- 826 -- 630 -- 490 -- 378 -- 280 -- 189 -- 175 -- 161 -- 147 -- 140 -- 154 -- 189 -- 245 -- 322 +- 336 - 420 -- 553 -- 756 -- 1183 -- 1134 -- 1078 -- 1022 -- 910 -- 784 -- 616 -- 483 -- 385 -- 308 -- 252 -- 210 -- 196 -- 182 -- 168 -- 154 -- 147 -- 161 -- 196 -- 259 -- 343 -- 455 -- 588 -- 784 -- 980 -- 1106 -- 1190 -- 1246 -- 1162 -- 1050 -- 882 -- 686 -- 532 -- 406 -- 308 -- 231 -- 210 -- 196 -- 182 -- 161 -- 147 -- 154 -- 182 -- 224 -- 280 -- 371 -- 483 -- 644 -- 896 -- 1092 -- 1211 -- 1155 -- 1029 -- 847 -- 651 -- 518 -- 413 -- 329 -- 266 -- 224 -- 203 -- 189 -- 175 -- 154 -- 140 -- 147 -- 175 -- 217 -- 273 -- 350 -- 462 -- 616 -- 868 -- 1064 -- 1197 -- 1113 -- 987 -- 826 -- 630 -- 504 -- 406 -- 322 -- 259 -- 217 +- 474 +- 510 +- 534 +- 498 +- 450 +- 378 +- 294 +- 228 +- 174 +- 132 +- 99 +- 90 +- 84 +- 78 +- 69 +- 63 +- 66 +- 78 +- 96 +- 120 +- 159 +- 207 +- 276 +- 384 +- 468 +- 519 +- 495 +- 441 +- 363 +- 279 +- 222 +- 177 +- 141 +- 114 +- 96 +- 87 +- 81 +- 75 +- 66 +- 60 +- 63 +- 75 +- 93 +- 117 +- 150 +- 198 +- 264 +- 372 +- 456 +- 513 +- 477 +- 423 +- 354 +- 270 +- 216 +- 174 +- 138 +- 111 +- 93 diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index 4212a5b40..bc52f3ee0 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -2,25 +2,39 @@ Example 33: Peak load management dispatch This example demonstrates: -1. Peak load management dispatch open loop control +1. Peak load management dispatch open loop control with two demand profiles of interest 2. Battery charging without an input stream, assuming purchase from the grid +In this example, two load profiles are provided. It is assumed that demand_profile is a +subset of demand_profile_2, where demand_profile_2 may represent the total demand of a +larger/upstream system. In this case, the upstream system reserves the right to choose +when to dispatch the battery up to three times per week. The remaining days the sub-system +may choose when and how to dispatch the battery. The subsystem has certain expected peak +windows that may be critical in terms of their cost structure, grid limits, or some other +reason and so they will only dispatch the battery for peaks in the chosen range. The top- +level system does not have such a requirement and will simply dispatch to reduce the highest +peaks. Perfect a priori demand knowledge is assumed. The battery is only allowed to discharge +once per day and is further restricted to not charge during the expected peak windows defined +by the sub-system operator. + """ import numpy as np +import pandas as pd import matplotlib.pyplot as plt +from matplotlib.patches import Patch from h2integrate.core.utilities import build_time_series_from_plant_config from h2integrate.core.h2integrate_model import H2IntegrateModel -# Create and setup the H2Integrate model +# Create, setup, and run the H2Integrate model model = H2IntegrateModel("33_peak_load_management.yaml") model.setup() - model.run() +# plot the results for the first week supervisor_demand = np.array( model.technology_config["technologies"]["battery"]["model_inputs"]["control_parameters"][ "demand_profile_2" @@ -34,14 +48,18 @@ n_plot = 24 * 7 time_plot = time_series[:n_plot] +# Shade peak window on every plotted day +peak_patch = Patch(facecolor="orange", alpha=0.12, label="Expected peak window (12pm to 7pm)") + fig, ax = plt.subplots(4, 1, sharex=True, figsize=(10, 5)) ax[0].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[0].plot(time_plot, supervisor_demand[:n_plot] * 1e-3, label="Overriding demand (MW)") ax[0].set(ylabel="Power (MW)", ylim=[-2, 2]) -ax[0].legend(frameon=False, ncol=2) +ax[0].legend(handles=[*ax[0].get_legend_handles_labels()[0], peak_patch], frameon=True, ncol=3) ax[1].plot(time_plot, model.prob.get_val("battery.SOC", units="percent")[:n_plot]) ax[1].set(ylabel="SOC", ylim=[0, 100]) +ax[1].legend(handles=[*ax[1].get_legend_handles_labels()[0]], frameon=False, ncol=2) ax[2].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[2].plot( @@ -50,7 +68,7 @@ label="Battery charge/discharge", ) ax[2].set(ylabel="Power (MW)", ylim=[-2, 2]) -ax[2].legend(frameon=False, ncol=2) +ax[2].legend(handles=[*ax[2].get_legend_handles_labels()[0]], frameon=False, ncol=2) ax[3].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[3].plot( @@ -59,13 +77,25 @@ label="New demand profile", ) ax[3].set(ylabel="Power (MW)", ylim=[-2, 2]) -ax[3].legend(frameon=False, ncol=2) +ax[3].legend(handles=[*ax[3].get_legend_handles_labels()[0]], frameon=False, ncol=2) ax[3].tick_params(axis="x", labelrotation=90) +days = pd.to_datetime(np.unique(pd.DatetimeIndex(time_plot).normalize())) +for axis in ax: + for day in days: + axis.axvspan( + day + pd.Timedelta(hours=12), + day + pd.Timedelta(hours=19), + color="orange", + alpha=0.12, + linewidth=0, + zorder=0, + ) + for axis in ax: axis.minorticks_on() axis.grid(True, which="major", alpha=0.45, linewidth=0.8) axis.grid(True, which="minor", alpha=0.2, linewidth=0.5) plt.tight_layout() -plt.savefig("example_peak_load_dispatch.pdf", transparent=True) +plt.savefig("example_peak_load_dispatch.png", transparent=False) diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index 28e0a3909..956ff6d9f 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -12,8 +12,8 @@ technologies: shared_parameters: commodity: electricity commodity_rate_units: kW - max_charge_rate: 500.0 # kW - max_capacity: 2000.0 # kWh, 1 MWh + max_charge_rate: 300.0 # kW + max_capacity: 1200.0 # kWh, 1 MWh max_soc_fraction: 0.9 # percent as decimal min_soc_fraction: 0.1 # percent as decimal init_soc_fraction: 0.9 # percent as decimal @@ -21,7 +21,7 @@ technologies: charge_efficiency: 1.0 # percent as decimal discharge_efficiency: 1.0 # percent as decimal control_parameters: - max_discharge_rate: 500.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate + max_discharge_rate: 300.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate charge_equals_discharge: true # enforce symmetric charge and discharge power limits demand_profile_2: !include demand_profiles/demand_profile_2.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. dispatch_priority_demand_profile: demand_profile_2 # demand profile the controller prioritizes when deciding dispatch @@ -29,7 +29,7 @@ technologies: override_events_period: W # pandas-style period code for resetting event counts; W means per week, M means month, etc peak_range: start: 12:00:00 # start of the preferred daily peak-shaving window - end: 17:00:00 # end of the preferred daily peak-shaving window + end: 19:00:00 # end of the preferred daily peak-shaving window advance_discharge_period: units: h # time units applied to the advance-discharge offset val: 1 # begin discharging this far ahead of the detected peak From 83c0e4fa17547fa308d22800fb9268d34b9aeeeb Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Fri, 10 Apr 2026 12:58:03 -0600 Subject: [PATCH 34/49] add docs page for peak load control --- docs/control/control_overview.md | 3 +- docs/control/open-loop_controllers.md | 102 +++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/docs/control/control_overview.md b/docs/control/control_overview.md index 902e7462f..89c98472f 100644 --- a/docs/control/control_overview.md +++ b/docs/control/control_overview.md @@ -11,7 +11,7 @@ Supported controllers: - [`DemandOpenLoopStorageController`](#demand-open-loop-storage-controller) - [`DemandOpenLoopConverterController`](#demand-open-loop-converter-controller) - [`FlexibleDemandOpenLoopConverterController`](#flexible-demand-open-loop-converter-controller) - += [`PeakLoadManagementOpenLoopStorageController`](#peak-load-management-open-loop-storage-controller) (pyomo-control-framework)= ## Pyomo control framework @@ -21,3 +21,4 @@ In the pyomo control framework in H2Integrate, each technology can have control Supported controllers: - [`HeuristicLoadFollowingController`](#heuristic-load-following-controller) +- [`OptimizedDispatchController`](#optimized-load-following-controller) diff --git a/docs/control/open-loop_controllers.md b/docs/control/open-loop_controllers.md index 61210eabf..cf70c0457 100644 --- a/docs/control/open-loop_controllers.md +++ b/docs/control/open-loop_controllers.md @@ -2,9 +2,10 @@ # Open-Loop Controllers ## Open-Loop Storage Controllers -The open-loop storage controllers can be attached as the control strategy in the `tech_config` for various storage converters (e.g., battery or hydrogen storage). There are two controller types for storage: -1. Pass-through Controller - passes the commodity flow to the output without any modification -2. Demand Open-Loop Storage Controller - uses simple logic to attempt to meet demand using the storage technology. +The open-loop storage controllers can be attached as the control strategy in the `tech_config` for various storage converters (e.g., battery or hydrogen storage). There are three controller types for storage: +1. [Simple Open-Loop Storage Controller](#pass-through-controller) — passes the commodity flow to the output with only minimal or no modifications. +2. [Demand Open-Loop Storage Controller](#demand-open-loop-storage-controller) — uses simple logic to attempt to meet demand using the storage technology. +3. [Peak Load Management Open-Loop Storage Controller](#peak-load-management-open-loop-storage-controller) — computes a peak-shaving dispatch schedule to reduce demand peaks, supporting one or two demand profiles with configurable event limits and time windows. (pass-through-controller)= ### Simple Open-Loop Storage Controller @@ -27,6 +28,101 @@ For examples of how to use the `DemandOpenLoopStorageController` open-loop contr - `examples/14_wind_hydrogen_dispatch/` - `examples/19_simple_dispatch/` +(peak-load-management-open-loop-storage-controller)= +### Peak Load Management Open-Loop Storage Controller +The `PeakLoadManagementOpenLoopStorageController` computes and executes a peak-shaving dispatch schedule assuming perfect forecasting. It is designed for reducing peak loads, not meeting a specific demand, using either one or two loads for determining peaks. + +The controller supports two demand profiles: + +- **`demand_profile`** — the local or sub-system demand. Peaks within a configurable daily time window (`peak_range`) are identified as candidate discharge targets. +- **`demand_profile_2`** — an optional upstream or supervisory demand. When provided, an operator can override the local peak schedule up to a configurable number of events per period (e.g., three times per week). Peaks are determined as the highest n peaks in each period. + +The `dispatch_priority_demand_profile` parameter selects which profile acts as the override schedule. On days where the priority profile flags a peak, the controller follows that schedule; on all other days it falls back to the other profile. + +**Dispatch logic (state machine)** + +1. **Discharge** — begins `advance_discharge_period` before the next scheduled peak and runs until `min_soc_fraction` is reached. +2. **Charge** — resumes after `delay_charge_period` has elapsed since the end of discharge, subject to the `allow_charge_in_peak_range` flag which can block recharging during the peak windows. +3. **Idle** — all other timesteps; set-point is zero. + +An example output for the first week of a one-year simulation is shown below. Orange shading marks the 12:00–19:00 daily peak window. The top panel shows both demand profiles; the second panel shows battery state of charge; the third shows battery charge/discharge power; the fourth shows the resulting net demand. + +![](./figures/example_peak_load_dispatch.png) + +For an example of how to use the `PeakLoadManagementOpenLoopStorageController`, see: +- `examples/33_peak_load_management/` + +#### Configuration +The controller is defined within the `tech_config` and requires the shared storage parameters plus a `control_parameters` block: + +**Storage system parameters used by the controller** + +| Field | Type | Description | +| --- | --- | --- | +| `commodity` | `str` | Commodity name (e.g., `electricity`). | +| `commodity_rate_units` | `str` | Rate units (e.g., `kW`). | +| `demand_profile` | scalar or list | Local demand timeseries. | +| `max_capacity` | `float` | Storage capacity in commodity amount units. | +| `max_charge_rate` | `float` | Maximum charge rate. | +| `max_discharge_rate` | `float` | Maximum discharge rate (required if `charge_equals_discharge: false`). | +| `charge_equals_discharge` | `bool` | If `true`, discharge rate equals `max_charge_rate`. | +| `max_soc_fraction` | `float` | Upper SOC limit as a fraction (0–1). | +| `min_soc_fraction` | `float` | Lower SOC limit as a fraction (0–1). | +| `init_soc_fraction` | `float` | Initial SOC as a fraction (0–1). | +| `charge_efficiency` | `float` | Charging efficiency (0–1). | +| `discharge_efficiency` | `float` | Discharging efficiency (0–1). | + +**Control-specific parameters** + +| Field | Type | Description | +| --- | --- | --- | +| `demand_profile_2` | scalar, list, or `null` | Optional supervisory/upstream demand timeseries. | +| `dispatch_priority_demand_profile` | `str` | Which profile controls scheduling: `demand_profile` or `demand_profile_2`. | +| `n_override_events` | `int \| null` | Maximum supervisory dispatch events allowed per `override_events_period`. | +| `override_events_period` | `str \| null` | Pandas period alias for resetting the event counter (e.g., `W` for weekly, `M` for monthly). | +| `peak_range` | `dict` | Daily window for local peak detection. Keys `start` and `end` as `HH:MM:SS` strings. | +| `advance_discharge_period` | `dict` | Lead time before a peak to start discharging. Keys `units` (e.g., `h`) and `val`. | +| `delay_charge_period` | `dict` | Wait after discharge before recharging. Keys `units` and `val`. | +| `allow_charge_in_peak_range` | `bool` | If `false`, charging is blocked during `peak_range`. | +| `min_peak_proximity` | `dict` | Minimum separation between retained peak events. Keys `units` and `val`. | + +```yaml +control_strategy: + model: PeakLoadManagementOpenLoopStorageController +model_inputs: + shared_parameters: + commodity: electricity + commodity_rate_units: kW + max_charge_rate: 300.0 + max_capacity: 1200.0 + max_soc_fraction: 0.9 + min_soc_fraction: 0.1 + init_soc_fraction: 0.9 + demand_profile: !include demand_profile.yaml + charge_efficiency: 1.0 + discharge_efficiency: 1.0 + control_parameters: + max_discharge_rate: 300.0 + charge_equals_discharge: true + demand_profile_2: !include demand_profile_2.yaml + dispatch_priority_demand_profile: demand_profile_2 + n_override_events: 3 + override_events_period: W + peak_range: + start: "12:00:00" + end: "19:00:00" + advance_discharge_period: + units: h + val: 1 + delay_charge_period: + units: h + val: 4 + allow_charge_in_peak_range: false + min_peak_proximity: + units: h + val: 4 +``` + ## Open-Loop Converter Controllers Open-loop converter controllers define rule-based logic for meeting commodity demand profiles without using dynamic system feedback. These controllers operate independently at each timestep. From 6ebe8ea7de02e767cf7989a55a92deb6492eac99 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Fri, 10 Apr 2026 12:59:47 -0600 Subject: [PATCH 35/49] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 420a41eba..238546a30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ data between functions in a module. [PR 590](https://github.com/NatLabRockies/H2Integrate/pull/590) - Adds `H2IntegrateModel.state` as an `IntEnum` to handle setup and run status checks. [PR 590](https://github.com/NatLabRockies/H2Integrate/pull/590) +- Adds `PeakLoadManagementOpenLoopStorageController` as a storage control strategy. [PR 641](https://github.com/NatLabRockies/H2Integrate/pull/641) ## 0.7.2 [April 9, 2026] From b0f3036b93e832bb66c4130e5eb7c3b47ad0f02b Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Fri, 10 Apr 2026 13:13:17 -0600 Subject: [PATCH 36/49] undue minor changes --- h2integrate/core/inputs/validation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/h2integrate/core/inputs/validation.py b/h2integrate/core/inputs/validation.py index 5d6a4e1e5..eaec69a51 100644 --- a/h2integrate/core/inputs/validation.py +++ b/h2integrate/core/inputs/validation.py @@ -147,7 +147,6 @@ def load_plant_yaml(finput): "plant_config['plant']['simulation']['n_timesteps'] is set to 8760." ) raise ValueError(msg) - if int(plant_config["plant"]["simulation"]["dt"]) != 3600: msg = ( "H2Integrate does not currently support simulations with a time step that is " From f63fd63f388cfc588779872df9b5e8236e284adb Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Fri, 10 Apr 2026 13:22:01 -0600 Subject: [PATCH 37/49] add PeakLoadManagementOpenLoopStorageController to model_overview --- docs/user_guide/model_overview.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/user_guide/model_overview.md b/docs/user_guide/model_overview.md index f2074bdf7..491e0bdd8 100644 --- a/docs/user_guide/model_overview.md +++ b/docs/user_guide/model_overview.md @@ -284,6 +284,7 @@ Below summarizes the available performance, cost, and financial models for each - `'SimpleStorageOpenLoopController'`: open-loop control; manages resource flow based on demand and input commodity - `'DemandOpenLoopStorageController'`: open-loop control; manages resource flow based on demand and storage constraints - `'HeuristicLoadFollowingController'`: open-loop control that works on a time window basis to set dispatch commands; uses Pyomo + - `'PeakLoadManagementOpenLoopStorageController'`: open-loop control that reduces peaks rather than trying to meet a load - Converter Controllers: - `'DemandOpenLoopConverterController'`: open-loop control; manages resource flow based on demand constraints - `'FlexibleDemandOpenLoopConverterController'`: open-loop control; manages resource flow based on demand and flexibility constraints From 71d973786bcf766a5f20c56f96b764d003371697 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Tue, 14 Apr 2026 17:18:00 -0600 Subject: [PATCH 38/49] add test for example 33 and add grid purchase profile to plot --- .../33_peak_load_management/plant_config.yaml | 3 +- .../run_peak_load_management.py | 8 ++- .../33_peak_load_management/tech_config.yaml | 4 +- examples/test/test_all_examples.py | 44 ++++++++++++++ .../plm_openloop_storage_controller.py | 16 +++++ .../test_plm_openloop_storage_controller.py | 60 ++++++++++++++++++- 6 files changed, 129 insertions(+), 6 deletions(-) diff --git a/examples/33_peak_load_management/plant_config.yaml b/examples/33_peak_load_management/plant_config.yaml index cca0ccd9a..0ba46e9fb 100644 --- a/examples/33_peak_load_management/plant_config.yaml +++ b/examples/33_peak_load_management/plant_config.yaml @@ -8,4 +8,5 @@ plant: timezone: -6 start_time: 2025/07/01 00:00:00 technology_interconnections: - - [battery, grid_buy, [electricity_out, electricity_in]] + # - [battery, grid_buy, [storage_electricity_charge, electricity_out]] + - [battery, grid_buy, [unmet_electricity_demand_out, electricity_demand]] diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index bc52f3ee0..a18fe7380 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -33,6 +33,7 @@ model.setup() model.run() +model.post_process() # plot the results for the first week supervisor_demand = np.array( @@ -41,7 +42,8 @@ ] ) -secondary_demand = model.prob.get_val("battery.electricity_demand") +secondary_demand = model.prob.get_val("battery.electricity_demand", units="kW") +grid_output = model.prob.get_val("grid_buy.electricity_out", units="MW") time_series = build_time_series_from_plant_config(model.plant_config) @@ -76,8 +78,10 @@ model.prob.get_val("battery.unmet_electricity_demand_out", units="MW")[:n_plot], label="New demand profile", ) +ax[3].plot(time_plot, grid_output[:n_plot], label="Grid purchase (MW)", linestyle=":") + ax[3].set(ylabel="Power (MW)", ylim=[-2, 2]) -ax[3].legend(handles=[*ax[3].get_legend_handles_labels()[0]], frameon=False, ncol=2) +ax[3].legend(handles=[*ax[3].get_legend_handles_labels()[0]], frameon=False, ncol=3) ax[3].tick_params(axis="x", labelrotation=90) days = pd.to_datetime(np.unique(pd.DatetimeIndex(time_plot).normalize())) diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index 956ff6d9f..1117751f9 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -20,9 +20,9 @@ technologies: demand_profile: !include demand_profiles/demand_profile.yaml charge_efficiency: 1.0 # percent as decimal discharge_efficiency: 1.0 # percent as decimal - control_parameters: - max_discharge_rate: 300.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate charge_equals_discharge: true # enforce symmetric charge and discharge power limits + max_discharge_rate: 300.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate + control_parameters: demand_profile_2: !include demand_profiles/demand_profile_2.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. dispatch_priority_demand_profile: demand_profile_2 # demand profile the controller prioritizes when deciding dispatch n_override_events: 3 # maximum number of peak events from the priority demand profile that the controller will respond to within each event period diff --git a/examples/test/test_all_examples.py b/examples/test/test_all_examples.py index c17920400..b32a4907d 100644 --- a/examples/test/test_all_examples.py +++ b/examples/test/test_all_examples.py @@ -2603,3 +2603,47 @@ def test_multivariable_streams_example(subtests, temp_copy_of_example): with subtests.test("Consumer avg pressure"): avg_pres = model.prob.get_val("gas_consumer.avg_pressure", units="bar") assert avg_pres[0] == pytest.approx(10.40, rel=1e-3) + + +@pytest.mark.integration +@pytest.mark.parametrize( + "example_folder,resource_example_folder", [("33_peak_load_management", None)] +) +def test_peak_load_management_example(subtests, temp_copy_of_example): + example_folder = temp_copy_of_example + + model = H2IntegrateModel(example_folder / "33_peak_load_management.yaml") + model.setup() + model.run() + + with subtests.test("Battery SOC mean"): + soc = model.prob.get_val("battery.SOC", units="percent") + assert soc.mean() == pytest.approx(63.333, rel=1e-3) + + with subtests.test("Battery SOC stays within bounds"): + soc = model.prob.get_val("battery.SOC", units="percent") + assert soc.max() <= 90.0 + 1e-3 + assert soc.min() >= 10.0 - 1e-3 + + with subtests.test("Battery set point sum"): + set_point = model.prob.get_val("battery.electricity_set_point", units="kW") + assert set_point.sum() == pytest.approx(60.0, rel=1e-3) + + with subtests.test("Battery electricity out sum"): + elec_out = model.prob.get_val("battery.electricity_out", units="kW") + assert elec_out.sum() == pytest.approx(60.0, rel=1e-3) + + with subtests.test("Battery unmet demand sum"): + unmet = model.prob.get_val("battery.unmet_electricity_demand_out", units="kW") + assert unmet.sum() == pytest.approx(1947378.0, rel=1e-3) + + with subtests.test("Battery CapEx"): + capex = model.prob.get_val("battery.CapEx", units="USD") + assert capex[0] == pytest.approx(603300.0, rel=1e-3) + + with subtests.test("Battery unmet demand sum equals purchased electricity"): + battery_unmet_demand = model.prob.get_val( + "battery.unmet_electricity_demand_out", units="kW" + ) + grid_purchase = model.prob.get_val("grid_buy.electricity_out", units="kW") + assert battery_unmet_demand.sum() == pytest.approx(grid_purchase.sum(), rel=1e-3) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index 40ef42dd9..bbfc2c711 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -1,3 +1,4 @@ +import warnings from copy import deepcopy from datetime import datetime, timedelta @@ -445,6 +446,21 @@ def compute(self, inputs, outputs): outputs[f"{commodity}_set_point"] = set_point_array + # insert warning message if for any time step the magnitude of + # any negative entry in set_point_array is greater than inputs[f"{commodity}_in"] + charging_requested = -np.minimum(set_point_array, 0.0) + available_input = np.asarray(inputs[f"{commodity}_in"]) + exceeds_available_input = charging_requested > available_input + + if np.any(exceeds_available_input): + first_idx = int(np.where(exceeds_available_input)[0][0]) + msg = ( + f"At timestep index {first_idx}, requested charging rate " + f"({charging_requested[first_idx]}) exceeds available {commodity} input " + f"({available_input[first_idx]})." + ) + warnings.warn(msg, UserWarning) + @staticmethod def get_peaks( demand_profile: dict, diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index d40154025..31b10d5bb 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -662,7 +662,7 @@ def test_plm_controller_blocking_charge_in_peak_range( prob.model.add_subsystem( name="IVC", - subsys=om.IndepVarComp(name="hydrogen_in", val=[40.0] * 24), + subsys=om.IndepVarComp(name="hydrogen_in", val=40.0, shape=24), promotes=["*"], ) @@ -700,3 +700,61 @@ def test_plm_controller_blocking_charge_in_peak_range( with subtests.test("SOC is lower after peak window than before"): # After discharge and attempted peak meeting, SOC should be lower assert soc[14] < soc[6] + + +@pytest.mark.regression +def test_plm_controller_warns_when_requested_charge_exceeds_input( + tech_config_base, plant_config_base +): + """Warn when controller asks to charge faster than available commodity input.""" + tech_config = tech_config_base + + tech_config["technologies"]["h2_storage"]["model_inputs"]["shared_parameters"] = { + "commodity": "hydrogen", + "commodity_rate_units": "kg/h", + "max_capacity": 100.0, + "max_soc_fraction": 1.0, + "min_soc_fraction": 0.1, + "init_soc_fraction": 0.2, + "max_charge_rate": 25.0, + "max_discharge_rate": 25.0, + "charge_equals_discharge": False, + "charge_efficiency": 0.95, + "discharge_efficiency": 0.95, + "demand_profile": np.full(24, 1.0), + "demand_profile_2": None, + "peak_range": {"start": "23:00:00", "end": "23:59:59"}, + "advance_discharge_period": {"units": "h", "val": 1}, + "delay_charge_period": {"units": "h", "val": 1}, + "allow_charge_in_peak_range": True, + "dispatch_priority_demand_profile": "demand_profile", + "min_peak_proximity": {"units": "h", "val": 4}, + } + + tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( + "PeakLoadManagementOpenLoopStorageController" + ) + + plant_config = plant_config_base + + prob = om.Problem() + + # Keep available input intentionally low so requested charging exceeds it. + prob.model.add_subsystem( + name="IVC", + subsys=om.IndepVarComp(name="hydrogen_in", val=np.full(24, 1.0), units="kg/h"), + promotes=["*"], + ) + + prob.model.add_subsystem( + "plm_controller", + PeakLoadManagementOpenLoopStorageController( + plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] + ), + promotes=["*"], + ) + + prob.setup() + + with pytest.warns(UserWarning, match="At timestep index 1, requested charging rate"): + prob.run_model() From 2867695fba48012e9d3a1ab71579ea25a46ec846 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 15 Apr 2026 13:28:13 -0600 Subject: [PATCH 39/49] update to be compatible with demand components (from PR 666) --- examples/33_peak_load_management/plant_config.yaml | 3 ++- .../run_peak_load_management.py | 2 +- examples/33_peak_load_management/tech_config.yaml | 10 +++++++++- examples/test/test_all_examples.py | 10 ++++++---- .../storage/plm_openloop_storage_controller.py | 2 +- .../test/test_plm_openloop_storage_controller.py | 2 +- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/examples/33_peak_load_management/plant_config.yaml b/examples/33_peak_load_management/plant_config.yaml index 0ba46e9fb..a6183e917 100644 --- a/examples/33_peak_load_management/plant_config.yaml +++ b/examples/33_peak_load_management/plant_config.yaml @@ -9,4 +9,5 @@ plant: start_time: 2025/07/01 00:00:00 technology_interconnections: # - [battery, grid_buy, [storage_electricity_charge, electricity_out]] - - [battery, grid_buy, [unmet_electricity_demand_out, electricity_demand]] + - [battery, electrical_load_demand, [electricity_out, electricity_in]] + - [electrical_load_demand, grid_buy, [unmet_electricity_demand_out, electricity_demand]] diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index a18fe7380..62755c32d 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -75,7 +75,7 @@ ax[3].plot(time_plot, secondary_demand[:n_plot] * 1e-3, label="Original demand (MW)") ax[3].plot( time_plot, - model.prob.get_val("battery.unmet_electricity_demand_out", units="MW")[:n_plot], + model.prob.get_val("electrical_load_demand.unmet_electricity_demand_out", units="MW")[:n_plot], label="New demand profile", ) ax[3].plot(time_plot, grid_output[:n_plot], label="Grid purchase (MW)", linestyle=":") diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index 1117751f9..cd227de82 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -17,11 +17,11 @@ technologies: max_soc_fraction: 0.9 # percent as decimal min_soc_fraction: 0.1 # percent as decimal init_soc_fraction: 0.9 # percent as decimal - demand_profile: !include demand_profiles/demand_profile.yaml charge_efficiency: 1.0 # percent as decimal discharge_efficiency: 1.0 # percent as decimal charge_equals_discharge: true # enforce symmetric charge and discharge power limits max_discharge_rate: 300.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate + demand_profile: !include demand_profiles/demand_profile.yaml control_parameters: demand_profile_2: !include demand_profiles/demand_profile_2.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. dispatch_priority_demand_profile: demand_profile_2 # demand profile the controller prioritizes when deciding dispatch @@ -45,6 +45,14 @@ technologies: energy_capex: 408 # $/kWh # conservative case for 2024 ATB utility scale batteries power_capex: 379 # $/kW # conservative case for 2024 ATB utility scale batteries opex_fraction: 0.025 # 2.5% percent of capex as per 2024 ATB for utility scale batteries + electrical_load_demand: + performance_model: + model: GenericDemandComponent + model_inputs: + performance_parameters: + commodity: electricity + commodity_rate_units: kW + demand_profile: !include demand_profiles/demand_profile.yaml grid_buy: performance_model: model: GridPerformanceModel diff --git a/examples/test/test_all_examples.py b/examples/test/test_all_examples.py index 705b456a1..8b7e7a5fe 100644 --- a/examples/test/test_all_examples.py +++ b/examples/test/test_all_examples.py @@ -2812,17 +2812,19 @@ def test_peak_load_management_example(subtests, temp_copy_of_example): elec_out = model.prob.get_val("battery.electricity_out", units="kW") assert elec_out.sum() == pytest.approx(60.0, rel=1e-3) - with subtests.test("Battery unmet demand sum"): - unmet = model.prob.get_val("battery.unmet_electricity_demand_out", units="kW") + with subtests.test("Unmet demand sum"): + unmet = model.prob.get_val( + "electrical_load_demand.unmet_electricity_demand_out", units="kW" + ) assert unmet.sum() == pytest.approx(1947378.0, rel=1e-3) with subtests.test("Battery CapEx"): capex = model.prob.get_val("battery.CapEx", units="USD") assert capex[0] == pytest.approx(603300.0, rel=1e-3) - with subtests.test("Battery unmet demand sum equals purchased electricity"): + with subtests.test("Unmet demand sum equals purchased electricity"): battery_unmet_demand = model.prob.get_val( - "battery.unmet_electricity_demand_out", units="kW" + "electrical_load_demand.unmet_electricity_demand_out", units="kW" ) grid_purchase = model.prob.get_val("grid_buy.electricity_out", units="kW") assert battery_unmet_demand.sum() == pytest.approx(grid_purchase.sum(), rel=1e-3) diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index bbfc2c711..b3b2091a9 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -455,7 +455,7 @@ def compute(self, inputs, outputs): if np.any(exceeds_available_input): first_idx = int(np.where(exceeds_available_input)[0][0]) msg = ( - f"At timestep index {first_idx}, requested charging rate " + f"WARNING: At time step index {first_idx}, requested charging rate " f"({charging_requested[first_idx]}) exceeds available {commodity} input " f"({available_input[first_idx]})." ) diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 31b10d5bb..89524a87e 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -756,5 +756,5 @@ def test_plm_controller_warns_when_requested_charge_exceeds_input( prob.setup() - with pytest.warns(UserWarning, match="At timestep index 1, requested charging rate"): + with pytest.warns(UserWarning, match="WARNING: At time step index 1, requested charging rate"): prob.run_model() From 617f8195da948657e4446a0c66d79d8b30fe2e60 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Mon, 20 Apr 2026 11:19:26 -0600 Subject: [PATCH 40/49] add comments. simplify documentation. remove meta data in favor of doc string descriptions. add key validator --- docs/control/control_overview.md | 2 +- docs/control/open-loop_controllers.md | 71 +------------------ .../33_peak_load_management/plant_config.yaml | 3 +- .../33_peak_load_management/tech_config.yaml | 4 +- .../plm_openloop_storage_controller.py | 40 +++-------- .../test_plm_openloop_storage_controller.py | 8 +-- h2integrate/core/utilities.py | 49 ++++++++++++- h2integrate/core/validators.py | 27 +++++++ 8 files changed, 89 insertions(+), 115 deletions(-) diff --git a/docs/control/control_overview.md b/docs/control/control_overview.md index 9c846b1ae..5405157ae 100644 --- a/docs/control/control_overview.md +++ b/docs/control/control_overview.md @@ -19,4 +19,4 @@ In the pyomo control framework in H2Integrate, each technology can have control Supported controllers: - [`HeuristicLoadFollowingStorageController`](#heuristic-load-following-controller) -- [`OptimizedDispatchController`](#optimized-load-following-controller)\ +- [`OptimizedDispatchController`](#optimized-load-following-controller) diff --git a/docs/control/open-loop_controllers.md b/docs/control/open-loop_controllers.md index 93edc0d73..537baf695 100644 --- a/docs/control/open-loop_controllers.md +++ b/docs/control/open-loop_controllers.md @@ -52,73 +52,4 @@ An example output for the first week of a one-year simulation is shown below. Or For an example of how to use the `PeakLoadManagementOpenLoopStorageController`, see: - `examples/33_peak_load_management/` -#### Configuration -The controller is defined within the `tech_config` and requires the shared storage parameters plus a `control_parameters` block: - -**Storage system parameters used by the controller** - -| Field | Type | Description | -| --- | --- | --- | -| `commodity` | `str` | Commodity name (e.g., `electricity`). | -| `commodity_rate_units` | `str` | Rate units (e.g., `kW`). | -| `demand_profile` | scalar or list | Local demand timeseries. | -| `max_capacity` | `float` | Storage capacity in commodity amount units. | -| `max_charge_rate` | `float` | Maximum charge rate. | -| `max_discharge_rate` | `float` | Maximum discharge rate (required if `charge_equals_discharge: false`). | -| `charge_equals_discharge` | `bool` | If `true`, discharge rate equals `max_charge_rate`. | -| `max_soc_fraction` | `float` | Upper SOC limit as a fraction (0–1). | -| `min_soc_fraction` | `float` | Lower SOC limit as a fraction (0–1). | -| `init_soc_fraction` | `float` | Initial SOC as a fraction (0–1). | -| `charge_efficiency` | `float` | Charging efficiency (0–1). | -| `discharge_efficiency` | `float` | Discharging efficiency (0–1). | - -**Control-specific parameters** - -| Field | Type | Description | -| --- | --- | --- | -| `demand_profile_2` | scalar, list, or `null` | Optional supervisory/upstream demand timeseries. | -| `dispatch_priority_demand_profile` | `str` | Which profile controls scheduling: `demand_profile` or `demand_profile_2`. | -| `n_override_events` | `int \| null` | Maximum supervisory dispatch events allowed per `override_events_period`. | -| `override_events_period` | `str \| null` | Pandas period alias for resetting the event counter (e.g., `W` for weekly, `M` for monthly). | -| `peak_range` | `dict` | Daily window for local peak detection. Keys `start` and `end` as `HH:MM:SS` strings. | -| `advance_discharge_period` | `dict` | Lead time before a peak to start discharging. Keys `units` (e.g., `h`) and `val`. | -| `delay_charge_period` | `dict` | Wait after discharge before recharging. Keys `units` and `val`. | -| `allow_charge_in_peak_range` | `bool` | If `false`, charging is blocked during `peak_range`. | -| `min_peak_proximity` | `dict` | Minimum separation between retained peak events. Keys `units` and `val`. | - -```yaml -control_strategy: - model: PeakLoadManagementOpenLoopStorageController -model_inputs: - shared_parameters: - commodity: electricity - commodity_rate_units: kW - max_charge_rate: 300.0 - max_capacity: 1200.0 - max_soc_fraction: 0.9 - min_soc_fraction: 0.1 - init_soc_fraction: 0.9 - demand_profile: !include demand_profile.yaml - charge_efficiency: 1.0 - discharge_efficiency: 1.0 - control_parameters: - max_discharge_rate: 300.0 - charge_equals_discharge: true - demand_profile_2: !include demand_profile_2.yaml - dispatch_priority_demand_profile: demand_profile_2 - n_override_events: 3 - override_events_period: W - peak_range: - start: "12:00:00" - end: "19:00:00" - advance_discharge_period: - units: h - val: 1 - delay_charge_period: - units: h - val: 4 - allow_charge_in_peak_range: false - min_peak_proximity: - units: h - val: 4 -``` +For API details, see the [`PeakLoadManagementOpenLoopStorageController` API documentation](../_autosummary/h2integrate.control.control_strategies.storage.plm_openloop_storage_controller). diff --git a/examples/33_peak_load_management/plant_config.yaml b/examples/33_peak_load_management/plant_config.yaml index a6183e917..8f86f593f 100644 --- a/examples/33_peak_load_management/plant_config.yaml +++ b/examples/33_peak_load_management/plant_config.yaml @@ -8,6 +8,7 @@ plant: timezone: -6 start_time: 2025/07/01 00:00:00 technology_interconnections: - # - [battery, grid_buy, [storage_electricity_charge, electricity_out]] + # include battery charge/discharge in the load - [battery, electrical_load_demand, [electricity_out, electricity_in]] + # buy power from the grid to fulfill demand including to accommodate battery operation - [electrical_load_demand, grid_buy, [unmet_electricity_demand_out, electricity_demand]] diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index cd227de82..7738a632b 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -13,14 +13,14 @@ technologies: commodity: electricity commodity_rate_units: kW max_charge_rate: 300.0 # kW + max_discharge_rate: 300.0 # kW. Defaults to battery power limit when matched to max_charge_rate + charge_equals_discharge: true # enforce symmetric charge and discharge power limits max_capacity: 1200.0 # kWh, 1 MWh max_soc_fraction: 0.9 # percent as decimal min_soc_fraction: 0.1 # percent as decimal init_soc_fraction: 0.9 # percent as decimal charge_efficiency: 1.0 # percent as decimal discharge_efficiency: 1.0 # percent as decimal - charge_equals_discharge: true # enforce symmetric charge and discharge power limits - max_discharge_rate: 300.0 # kW/time step; defaults to battery power limit when matched to max_charge_rate demand_profile: !include demand_profiles/demand_profile.yaml control_parameters: demand_profile_2: !include demand_profiles/demand_profile_2.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index b3b2091a9..fde97f468 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -7,7 +7,7 @@ from attrs import field, define from h2integrate.core.utilities import merge_shared_inputs, build_time_series_from_plant_config -from h2integrate.core.validators import contains +from h2integrate.core.validators import contains, has_required_keys from h2integrate.control.control_strategies.storage.openloop_storage_control_base import ( StorageOpenLoopControlBase, StorageOpenLoopControlBaseConfig, @@ -19,8 +19,8 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa """ Configuration class for the PeakLoadManagementOpenLoopStorageController. - Defines the storage limits, efficiencies, and peak-selection rules used to - pre-compute an open-loop discharge and recharge schedule. + Defines peak-selection and dispatch-priority rules used to pre-compute + an open-loop discharge and recharge schedule. Attributes: demand_profile_2 (int | float | list | None, optional): Demand values for @@ -65,35 +65,11 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa ) n_override_events: int | None = field(default=None) override_events_period: int | str | None = field(default=None) - peak_range: dict = field( - metadata={ - "description": "Daily time window for peak detection. " - "Dict with 'start' and 'end' as HH:MM:SS strings." - }, - ) - advance_discharge_period: dict = field( - metadata={ - "description": "How long before a peak to start discharging. " - "Dict with 'units' (timedelta unit str) and 'val' (numeric)." - }, - ) - delay_charge_period: dict = field( - metadata={ - "description": "Minimum delay after discharge completes before charging resumes. " - "Dict with 'units' and 'val'." - }, - ) - allow_charge_in_peak_range: bool = field( - default=True, - metadata={"description": "If False, charging is suppressed during peak_range."}, - ) - min_peak_proximity: dict = field( - metadata={ - "description": "Minimum time allowed between peak events. An error is raised if " - "peak events do not respect the given time separation." - "Dict with 'units' and 'val'." - }, - ) + peak_range: dict = field(validator=has_required_keys(["start", "end"])) + advance_discharge_period: dict = field(validator=has_required_keys(["units", "val"])) + delay_charge_period: dict = field(validator=has_required_keys(["units", "val"])) + allow_charge_in_peak_range: bool = field(default=True) + min_peak_proximity: dict = field(validator=has_required_keys(["units", "val"])) def __attrs_post_init__(self): super().__attrs_post_init__() diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index 89524a87e..b0e2d220c 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -25,19 +25,13 @@ def tech_config_base(): "model": "SimpleStorageOpenLoopController", }, "performance_model": { - "model": "StorageAutoSizingModel", - }, - "cost_model": { - "model": "LinedRockCavernStorageCostModel", + "model": "StoragePerformanceModel", }, "model_inputs": { "shared_parameters": { "commodity": "hydrogen", "commodity_rate_units": "kg/h", }, - "cost_parameters": { - "sizing_mode": "auto", - }, }, }, }, diff --git a/h2integrate/core/utilities.py b/h2integrate/core/utilities.py index 1244c0b5f..b1f540573 100644 --- a/h2integrate/core/utilities.py +++ b/h2integrate/core/utilities.py @@ -195,7 +195,28 @@ def attr_filter(inst: Attribute, value: Any) -> bool: def build_time_series_from_plant_config(plant_config): - """Build simulation timestamps from plant_config simulation settings.""" + """Build simulation timestamps from the simulation settings in a plant config. + + Extracts ``n_timesteps``, ``dt``, ``timezone``, and ``start_time`` from + ``plant_config["plant"]["simulation"]`` and delegates to + :func:`build_time_series`. + + Args: + plant_config (dict): Plant-level configuration dictionary. Must contain + a ``plant.simulation`` sub-dict with the following keys: + + - ``n_timesteps`` (int): Number of simulation timesteps. + - ``dt`` (int): Timestep size in seconds. + - ``timezone`` (int): UTC offset in integer hours (e.g., ``-6`` for + UTC-6). + - ``start_time`` (str): Start timestamp parseable by + :class:`pandas.Timestamp`. + + Returns: + numpy.ndarray: Array of :class:`datetime.datetime` objects of length + ``n_timesteps``, equally spaced by ``dt`` seconds, starting at + ``start_time`` in the specified timezone. + """ simulation_cfg = plant_config["plant"]["simulation"] n_timesteps = int(simulation_cfg["n_timesteps"]) dt_seconds = int(simulation_cfg["dt"]) @@ -214,7 +235,31 @@ def build_time_series( time_zone: int, start_year: int | None = None, ): - # Optional start_time in config; default to a fixed reference timestamp. + """Build an array of evenly spaced timezone-aware datetime objects. + + Constructs a :class:`pandas.DatetimeIndex` of length ``n_timesteps`` + beginning at ``start_time`` with a fixed frequency of ``dt_seconds`` + seconds, then converts it to a NumPy array of :class:`datetime.datetime` + objects via :meth:`pandas.DatetimeIndex.to_pydatetime`. + + Args: + start_time (str): Start timestamp string parseable by + :class:`pandas.Timestamp` (e.g., ``"2025-01-01 00:00:00"`` or + ``"01-01 00:00:00"`` when ``start_year`` is provided). + dt_seconds (int): Timestep duration in seconds (e.g., ``3600`` for + hourly, ``1800`` for half-hourly). + n_timesteps (int): Number of timestamps to generate. + time_zone (int): UTC offset in integer hours applied to the series + (e.g., ``-6`` for UTC-6). + start_year (int | None, optional): If provided, overrides the year + component of ``start_time``. Useful when ``start_time`` omits the + year. Defaults to ``None``. + + Returns: + numpy.ndarray: Array of :class:`datetime.datetime` objects of length + ``n_timesteps``, equally spaced by ``dt_seconds`` seconds. + """ + start_timestamp = pd.Timestamp(start_time, tz=time_zone, year=start_year) freq = pd.to_timedelta(dt_seconds, unit="s") diff --git a/h2integrate/core/validators.py b/h2integrate/core/validators.py index 6fcf0b763..27bb59187 100644 --- a/h2integrate/core/validators.py +++ b/h2integrate/core/validators.py @@ -47,6 +47,33 @@ def validator(instance, attribute, value): return validator +def has_required_keys(required_keys): + """Validates that a value is a dict containing all required keys. + + Args: + required_keys (list[str] | tuple[str, ...]): Keys that must be present + in the input dictionary. + """ + + required_keys = tuple(required_keys) + + def validator(instance, attribute, value): + if not isinstance(value, dict): + raise ValueError( + f"{attribute.name} must be a dict containing keys {required_keys}, " + f"got {type(value).__name__}." + ) + + missing_keys = [key for key in required_keys if key not in value] + if missing_keys: + raise ValueError( + f"{attribute.name} is missing required key(s): {missing_keys}. " + f"Expected keys include: {required_keys}." + ) + + return validator + + def must_equal(required_value): """Validates that an item equals a specific value""" From 30484e3e5ccbc450df1fcfb726b9af595850d987 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Mon, 20 Apr 2026 11:42:26 -0600 Subject: [PATCH 41/49] update docs and example to demarcate override peaks --- .../figures/example_peak_load_dispatch.png | Bin 0 -> 108588 bytes docs/control/open-loop_controllers.md | 2 +- .../demand_profiles/demand_profile_2.yaml | 16 +++---- .../run_peak_load_management.py | 42 ++++++++++++++++++ 4 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 docs/control/figures/example_peak_load_dispatch.png diff --git a/docs/control/figures/example_peak_load_dispatch.png b/docs/control/figures/example_peak_load_dispatch.png new file mode 100644 index 0000000000000000000000000000000000000000..5acc390349cdc5e9577d6aef4aa6eacd30c0bf03 GIT binary patch literal 108588 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 qx_$Jgi{{bM1= day_start) & (time_plot < day_end) + if day_mask.any(): + day_indices = np.where(day_mask)[0] + peak_idx = day_indices[np.argmax(supervisor_demand_first_week[day_indices])] + peak_time = time_plot[peak_idx] + peak_value = supervisor_demand_first_week[peak_idx] + daily_peaks.append((peak_time, peak_value)) + +# Sort by peak value and get top 3 +top_3_peaks = sorted(daily_peaks, key=lambda x: x[1], reverse=True)[:3] +top_3_peaks_sorted_by_time = sorted(top_3_peaks, key=lambda x: x[0]) + +# Draw vertical dashed lines for top 3 daily peaks across all subplots +colors = ["k", "k", "k"] +for idx, (peak_time, _) in enumerate(top_3_peaks_sorted_by_time): + for axis in ax: + axis.axvline(peak_time, color=colors[idx], linestyle="--", linewidth=1.5, alpha=0.7) + # Add label on top subplot + ax[0].text( + peak_time, + ax[0].get_ylim()[1] + 0.3, + f"Peak override {idx + 1}", + fontsize=9, + ha="center", + color=colors[idx], + weight="bold", + ) +########################################################################################### + plt.tight_layout() plt.savefig("example_peak_load_dispatch.png", transparent=False) From a1bab8362b15718959b3e34401ee20f56d81dd6a Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Mon, 20 Apr 2026 11:45:33 -0600 Subject: [PATCH 42/49] update docs --- docs/control/open-loop_controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/control/open-loop_controllers.md b/docs/control/open-loop_controllers.md index f40c5e7b5..d30692e0d 100644 --- a/docs/control/open-loop_controllers.md +++ b/docs/control/open-loop_controllers.md @@ -45,7 +45,7 @@ The `dispatch_priority_demand_profile` parameter selects which profile acts as t 2. **Charge** — resumes after `delay_charge_period` has elapsed since the end of discharge, subject to the `allow_charge_in_peak_range` flag which can block recharging during the peak windows. 3. **Idle** — all other timesteps; set-point is zero. -An example output for the first week of a one-year simulation is shown below. Orange shading marks the 12:00–19:00 daily peak window. The top panel shows both demand profiles; the second panel shows battery state of charge; the third shows battery charge/discharge power; the fourth shows the resulting net demand. Periods where `demand_profile_2` takes precedence are marked with vertical dashed lines (three occurrences in the week shown). +An example output for the first week of a one-year simulation is shown below. Orange shading marks the 12:00–19:00 daily peak window. The top panel shows both demand profiles; the second panel shows battery state of charge; the third shows battery charge/discharge power; the fourth shows the resulting net demand. Periods where `demand_profile_2` takes precedence are marked with vertical dashed lines (three occurrences in the week shown). Note that where `demand_profile_2` does not override, the peaks in `demand_profile` are reduced. ![](./figures/example_peak_load_dispatch.png) From 9d7b7a316667ff174950cf1ed52eccb0ca7677e0 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Mon, 20 Apr 2026 11:47:20 -0600 Subject: [PATCH 43/49] add doc comment --- docs/control/open-loop_controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/control/open-loop_controllers.md b/docs/control/open-loop_controllers.md index d30692e0d..2ab658ac1 100644 --- a/docs/control/open-loop_controllers.md +++ b/docs/control/open-loop_controllers.md @@ -30,7 +30,7 @@ For examples of how to use the `DemandOpenLoopStorageController` open-loop contr (peak-load-management-open-loop-storage-controller)= ### Peak Load Management Open-Loop Storage Controller -The `PeakLoadManagementOpenLoopStorageController` computes and executes a peak-shaving dispatch schedule assuming perfect forecasting. It is designed for reducing peak loads, not meeting a specific demand, using either one or two loads for determining peaks. +The `PeakLoadManagementOpenLoopStorageController` computes and executes a peak-shaving dispatch schedule assuming perfect forecasting. It is designed for reducing peak loads, not meeting a specific demand, using either one or two loads for determining peaks. The algorithm only supports daily cycles, but could be adjusted to accommodate alternate cycle rates. The controller supports two demand profiles: From c0a15617d2b9af1fdf12c837f50b509d28c75ebd Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Mon, 20 Apr 2026 11:54:31 -0600 Subject: [PATCH 44/49] move static method to after compute --- docs/control/open-loop_controllers.md | 6 +- .../plm_openloop_storage_controller.py | 78 +++++++++---------- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/docs/control/open-loop_controllers.md b/docs/control/open-loop_controllers.md index 2ab658ac1..9c7a3d1f0 100644 --- a/docs/control/open-loop_controllers.md +++ b/docs/control/open-loop_controllers.md @@ -30,7 +30,11 @@ For examples of how to use the `DemandOpenLoopStorageController` open-loop contr (peak-load-management-open-loop-storage-controller)= ### Peak Load Management Open-Loop Storage Controller -The `PeakLoadManagementOpenLoopStorageController` computes and executes a peak-shaving dispatch schedule assuming perfect forecasting. It is designed for reducing peak loads, not meeting a specific demand, using either one or two loads for determining peaks. The algorithm only supports daily cycles, but could be adjusted to accommodate alternate cycle rates. +The `PeakLoadManagementOpenLoopStorageController` computes and executes a peak-shaving dispatch schedule assuming perfect forecasting. It is designed for reducing peak loads, not meeting a specific demand, using either one or two loads for determining peaks. + +```{note} +The algorithm currently only supports daily cycles, but could be adjusted to accommodate alternate cycle rates. +``` The controller supports two demand profiles: diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index fde97f468..fc84e2ac3 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -217,45 +217,6 @@ def setup(self): else: self.peaks_2_df = None - @staticmethod - def _build_demand_profile_dict(demand_profile, time_series): - """Convert scalar/list demand input into a timestamped demand dictionary.""" - n_timesteps = len(time_series) - if np.isscalar(demand_profile): - demand_values = np.full(n_timesteps, float(demand_profile), dtype=float) - else: - demand_values = np.asarray(demand_profile, dtype=float) - - if len(demand_values) != n_timesteps: - raise ValueError( - "demand_profile length must equal n_timesteps " - f"({len(demand_values)} != {n_timesteps})" - ) - - return { - "date_time": time_series, - "demand": demand_values, - } - - @staticmethod - def _parse_peak_range(peak_range): - """Validate and parse peak_range values from HH:MM:SS strings. - - Returns a dict with datetime.time objects. - """ - if not isinstance(peak_range, dict): - raise ValueError("peak_range must be a dict with keys 'start' and 'end'") - if "start" not in peak_range or "end" not in peak_range: - raise ValueError("peak_range must be a dict with keys 'start' and 'end'") - - parsed = {} - for key, value in peak_range.items(): - if not isinstance(value, str): - raise ValueError(f"peak_range['{key}'] must be an HH:MM:SS string") - parsed[key] = datetime.strptime(value, "%H:%M:%S").time() - - return parsed - def compute(self, inputs, outputs): """ Compute storage state of charge (SOC), delivered output, curtailment, and unmet @@ -437,6 +398,45 @@ def compute(self, inputs, outputs): ) warnings.warn(msg, UserWarning) + @staticmethod + def _build_demand_profile_dict(demand_profile, time_series): + """Convert scalar/list demand input into a timestamped demand dictionary.""" + n_timesteps = len(time_series) + if np.isscalar(demand_profile): + demand_values = np.full(n_timesteps, float(demand_profile), dtype=float) + else: + demand_values = np.asarray(demand_profile, dtype=float) + + if len(demand_values) != n_timesteps: + raise ValueError( + "demand_profile length must equal n_timesteps " + f"({len(demand_values)} != {n_timesteps})" + ) + + return { + "date_time": time_series, + "demand": demand_values, + } + + @staticmethod + def _parse_peak_range(peak_range): + """Validate and parse peak_range values from HH:MM:SS strings. + + Returns a dict with datetime.time objects. + """ + if not isinstance(peak_range, dict): + raise ValueError("peak_range must be a dict with keys 'start' and 'end'") + if "start" not in peak_range or "end" not in peak_range: + raise ValueError("peak_range must be a dict with keys 'start' and 'end'") + + parsed = {} + for key, value in peak_range.items(): + if not isinstance(value, str): + raise ValueError(f"peak_range['{key}'] must be an HH:MM:SS string") + parsed[key] = datetime.strptime(value, "%H:%M:%S").time() + + return parsed + @staticmethod def get_peaks( demand_profile: dict, From 515557d2bbd82b9e01872ce560722a0b3d7db1e8 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Mon, 20 Apr 2026 11:59:48 -0600 Subject: [PATCH 45/49] Update docs/control/open-loop_controllers.md Co-authored-by: kbrunik <102193481+kbrunik@users.noreply.github.com> --- docs/control/open-loop_controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/control/open-loop_controllers.md b/docs/control/open-loop_controllers.md index d30692e0d..b72e637ef 100644 --- a/docs/control/open-loop_controllers.md +++ b/docs/control/open-loop_controllers.md @@ -2,7 +2,7 @@ # Open-Loop Controllers ## Open-Loop Storage Controllers -The open-loop storage controllers can be attached as the control strategy in the `tech_config` for various storage converters (e.g., battery or hydrogen storage). There are three controller types for storage: +The open-loop storage controllers can be attached as the control strategy in the `tech_config` for various storage components (e.g., battery or hydrogen storage). There are three controller types for storage: 1. [Simple Open-Loop Storage Controller](#pass-through-controller) — passes the commodity flow to the output with only minimal or no modifications. 2. [Demand Open-Loop Storage Controller](#demand-open-loop-storage-controller) — uses simple logic to attempt to meet demand using the storage technology. 3. [Peak Load Management Open-Loop Storage Controller](#peak-load-management-open-loop-storage-controller) — computes a peak-shaving dispatch schedule to reduce demand peaks, supporting one or two demand profiles with configurable event limits and time windows. From e103abeedecacc6abd07de193ba0a5085d87e3f0 Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Mon, 20 Apr 2026 12:10:35 -0600 Subject: [PATCH 46/49] minor update --- docs/control/open-loop_controllers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/control/open-loop_controllers.md b/docs/control/open-loop_controllers.md index 4d68fa777..c62bbff1f 100644 --- a/docs/control/open-loop_controllers.md +++ b/docs/control/open-loop_controllers.md @@ -41,7 +41,7 @@ The controller supports two demand profiles: - **`demand_profile`** — the local or sub-system demand. Peaks within a configurable daily time window (`peak_range`) are identified as candidate discharge targets. - **`demand_profile_2`** — an optional upstream or supervisory demand. When provided, an operator can override the local peak schedule up to a configurable number of events per period (e.g., three times per week). Peaks are determined as the highest n peaks in each period. -The `dispatch_priority_demand_profile` parameter selects which profile acts as the override schedule. On days where the priority profile flags a peak, the controller follows that schedule; on all other days it falls back to the other profile. +The `dispatch_priority_demand_profile` parameter selects which profile acts as the override schedule. On days where the priority profile flags a peak (up to n override instances in the given time period), the controller follows that schedule; on all other days it falls back to the other profile. **Dispatch logic (state machine)** From 750b61b9ce9a1923c7d3fa8fa70045575bcdb0fe Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 22 Apr 2026 16:07:28 -0600 Subject: [PATCH 47/49] rename demand_profile_2 to demand_profile_upstream and add Heuristic to PeakLoadManagementOpenLoopController name --- CHANGELOG.md | 2 +- docs/control/control_overview.md | 2 +- docs/control/open-loop_controllers.md | 10 ++--- docs/user_guide/model_overview.md | 2 +- .../run_peak_load_management.py | 6 +-- .../33_peak_load_management/tech_config.yaml | 6 +-- .../plm_openloop_storage_controller.py | 40 ++++++++++--------- .../test_plm_openloop_storage_controller.py | 32 +++++++-------- h2integrate/core/supported_models.py | 6 ++- 9 files changed, 55 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32873ef18..66ab83c94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,7 +60,7 @@ - Modified CI setup so Windows is temporarily disabled and also so unit, regression, and integration tests are run in separate jobs to speed up testing and provide more information on test failures. [PR 668](https://github.com/NatLabRockies/H2Integrate/pull/668) - Added infrastructure for running models with non-hourly time steps via a class attribute `_time_step_bounds` and sets new time step bounds of 5-minutes to 1-hour for the grid components. [PR 653](https://github.com/NatLabRockies/H2Integrate/pull/653) and [PR 671](https://github.com/NatLabRockies/H2Integrate/pull/671) - Remove demand-related outputs from storage performance models and replace usage with demand components [PR 666](https://github.com/NatLabRockies/H2Integrate/pull/666) -- Adds `PeakLoadManagementOpenLoopStorageController` as a storage control strategy. [PR 641](https://github.com/NatLabRockies/H2Integrate/pull/641) +- Adds `PeakLoadManagementHeuristicOpenLoopStorageController` as a storage control strategy. [PR 641](https://github.com/NatLabRockies/H2Integrate/pull/641) ## 0.7.2 [April 9, 2026] diff --git a/docs/control/control_overview.md b/docs/control/control_overview.md index 5405157ae..1b18fd85b 100644 --- a/docs/control/control_overview.md +++ b/docs/control/control_overview.md @@ -9,7 +9,7 @@ The first approach, [open-loop control](#open-loop-control), assumes no feedback Supported controllers: - [`SimpleStorageOpenLoopController`](#pass-through-controller) - [`DemandOpenLoopStorageController`](#demand-open-loop-storage-controller) -- [`PeakLoadManagementOpenLoopStorageController`](#peak-load-management-open-loop-storage-controller) +- [`PeakLoadManagementHeuristicOpenLoopStorageController`](#peak-load-management-open-loop-storage-controller) (pyomo-control-framework)= ## Pyomo control framework diff --git a/docs/control/open-loop_controllers.md b/docs/control/open-loop_controllers.md index c62bbff1f..5ee3b3cdc 100644 --- a/docs/control/open-loop_controllers.md +++ b/docs/control/open-loop_controllers.md @@ -30,7 +30,7 @@ For examples of how to use the `DemandOpenLoopStorageController` open-loop contr (peak-load-management-open-loop-storage-controller)= ### Peak Load Management Open-Loop Storage Controller -The `PeakLoadManagementOpenLoopStorageController` computes and executes a peak-shaving dispatch schedule assuming perfect forecasting. It is designed for reducing peak loads, not meeting a specific demand, using either one or two loads for determining peaks. +The `PeakLoadManagementHeuristicOpenLoopStorageController` computes and executes a peak-shaving dispatch schedule assuming perfect forecasting. It is designed for reducing peak loads, not meeting a specific demand, using either one or two loads for determining peaks. ```{note} The algorithm currently only supports daily cycles, but could be adjusted to accommodate alternate cycle rates. @@ -39,7 +39,7 @@ The algorithm currently only supports daily cycles, but could be adjusted to acc The controller supports two demand profiles: - **`demand_profile`** — the local or sub-system demand. Peaks within a configurable daily time window (`peak_range`) are identified as candidate discharge targets. -- **`demand_profile_2`** — an optional upstream or supervisory demand. When provided, an operator can override the local peak schedule up to a configurable number of events per period (e.g., three times per week). Peaks are determined as the highest n peaks in each period. +- **`demand_profile_upstream`** — an optional upstream or supervisory demand. When provided, an operator can override the local peak schedule up to a configurable number of events per period (e.g., three times per week). Peaks are determined as the highest n peaks in each period. The `dispatch_priority_demand_profile` parameter selects which profile acts as the override schedule. On days where the priority profile flags a peak (up to n override instances in the given time period), the controller follows that schedule; on all other days it falls back to the other profile. @@ -49,11 +49,11 @@ The `dispatch_priority_demand_profile` parameter selects which profile acts as t 2. **Charge** — resumes after `delay_charge_period` has elapsed since the end of discharge, subject to the `allow_charge_in_peak_range` flag which can block recharging during the peak windows. 3. **Idle** — all other timesteps; set-point is zero. -An example output for the first week of a one-year simulation is shown below. Orange shading marks the 12:00–19:00 daily peak window. The top panel shows both demand profiles; the second panel shows battery state of charge; the third shows battery charge/discharge power; the fourth shows the resulting net demand. Periods where `demand_profile_2` takes precedence are marked with vertical dashed lines (three occurrences in the week shown). Note that where `demand_profile_2` does not override, the peaks in `demand_profile` are reduced. +An example output for the first week of a one-year simulation is shown below. Orange shading marks the 12:00–19:00 daily peak window. The top panel shows both demand profiles; the second panel shows battery state of charge; the third shows battery charge/discharge power; the fourth shows the resulting net demand. Periods where `demand_profile_upstream` takes precedence are marked with vertical dashed lines (three occurrences in the week shown). Note that where `demand_profile_upstream` does not override, the peaks in `demand_profile` are reduced. ![](./figures/example_peak_load_dispatch.png) -For an example of how to use the `PeakLoadManagementOpenLoopStorageController`, see: +For an example of how to use the `PeakLoadManagementHeuristicOpenLoopStorageController`, see: - `examples/33_peak_load_management/` -For API details, see the [`PeakLoadManagementOpenLoopStorageController` API documentation](../_autosummary/h2integrate.control.control_strategies.storage.plm_openloop_storage_controller). +For API details, see the [`PeakLoadManagementHeuristicOpenLoopStorageController` API documentation](../_autosummary/h2integrate.control.control_strategies.storage.plm_openloop_storage_controller). diff --git a/docs/user_guide/model_overview.md b/docs/user_guide/model_overview.md index 67ae2cb98..e4ad7e8bf 100644 --- a/docs/user_guide/model_overview.md +++ b/docs/user_guide/model_overview.md @@ -285,7 +285,7 @@ Below summarizes the available performance, cost, and financial models for each - `'SimpleStorageOpenLoopController'`: open-loop control; manages resource flow based on demand and input commodity - `'DemandOpenLoopStorageController'`: open-loop control; manages resource flow based on demand and storage constraints - `'HeuristicLoadFollowingStorageController'`: open-loop control that works on a time window basis to set dispatch commands; uses Pyomo - - `'PeakLoadManagementOpenLoopStorageController'`: open-loop control that reduces peaks rather than trying to meet a load + - `'PeakLoadManagementHeuristicOpenLoopStorageController'`: open-loop control that reduces peaks rather than trying to meet a load - Optimized Dispatch: - `'OptimizedDispatchStorageController'`: optimization-based dispatch using Pyomo diff --git a/examples/33_peak_load_management/run_peak_load_management.py b/examples/33_peak_load_management/run_peak_load_management.py index cc2ba44d6..7fb7f10b7 100644 --- a/examples/33_peak_load_management/run_peak_load_management.py +++ b/examples/33_peak_load_management/run_peak_load_management.py @@ -6,7 +6,7 @@ 2. Battery charging without an input stream, assuming purchase from the grid In this example, two load profiles are provided. It is assumed that demand_profile is a -subset of demand_profile_2, where demand_profile_2 may represent the total demand of a +subset of demand_profile_upstream, where demand_profile_upstream may represent the total demand of a larger/upstream system. In this case, the upstream system reserves the right to choose when to dispatch the battery up to three times per week. The remaining days the sub-system may choose when and how to dispatch the battery. The subsystem has certain expected peak @@ -17,7 +17,7 @@ once per day and is further restricted to not charge during the expected peak windows defined by the sub-system operator. -The output figure indicates peaks from demand_profile_2 that were selected to override the +The output figure indicates peaks from demand_profile_upstream that were selected to override the peaks in demand_profile to demonstrate how the peak selection impacts dispatch. """ @@ -41,7 +41,7 @@ # plot the results for the first week supervisor_demand = np.array( model.technology_config["technologies"]["battery"]["model_inputs"]["control_parameters"][ - "demand_profile_2" + "demand_profile_upstream" ] ) diff --git a/examples/33_peak_load_management/tech_config.yaml b/examples/33_peak_load_management/tech_config.yaml index 7738a632b..e1a9ff88f 100644 --- a/examples/33_peak_load_management/tech_config.yaml +++ b/examples/33_peak_load_management/tech_config.yaml @@ -7,7 +7,7 @@ technologies: cost_model: model: ATBBatteryCostModel control_strategy: - model: PeakLoadManagementOpenLoopStorageController + model: PeakLoadManagementHeuristicOpenLoopStorageController model_inputs: shared_parameters: commodity: electricity @@ -23,8 +23,8 @@ technologies: discharge_efficiency: 1.0 # percent as decimal demand_profile: !include demand_profiles/demand_profile.yaml control_parameters: - demand_profile_2: !include demand_profiles/demand_profile_2.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. - dispatch_priority_demand_profile: demand_profile_2 # demand profile the controller prioritizes when deciding dispatch + demand_profile_upstream: !include demand_profiles/demand_profile_upstream.yaml # demand used to define when the supervisor commands battery dispatch. This may represent an upstream load. + dispatch_priority_demand_profile: demand_profile_upstream # demand profile the controller prioritizes when deciding dispatch n_override_events: 3 # maximum number of peak events from the priority demand profile that the controller will respond to within each event period override_events_period: W # pandas-style period code for resetting event counts; W means per week, M means month, etc peak_range: diff --git a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py index fc84e2ac3..31624ed8a 100644 --- a/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/plm_openloop_storage_controller.py @@ -15,20 +15,20 @@ @define(kw_only=True) -class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBaseConfig): +class PeakLoadManagementHeuristicOpenLoopStorageControllerConfig(StorageOpenLoopControlBaseConfig): """ - Configuration class for the PeakLoadManagementOpenLoopStorageController. + Configuration class for the PeakLoadManagementHeuristicOpenLoopStorageController. Defines peak-selection and dispatch-priority rules used to pre-compute an open-loop discharge and recharge schedule. Attributes: - demand_profile_2 (int | float | list | None, optional): Demand values for + demand_profile_upstream (int | float | list | None, optional): Demand values for additional connected system for each timestep, in the same units as `commodity_rate_units`. May be a scalar for constant demand or a list/array for time-varying demand. dispatch_priority_demand_profile (str | None, optional): which demand profile takes - precedence for dispatch decisions. One of ["demand_profile", "demand_profile_2"]. + precedence for dispatch decisions. One of ["demand_profile", "demand_profile_upstream"]. n_override_events: (int | None, optional): The maximum number of discharge events allowed for the priority profile in the period specified in override_events_period, or across all time steps if override_events_period is None. @@ -59,9 +59,9 @@ class PeakLoadManagementOpenLoopStorageControllerConfig(StorageOpenLoopControlBa require_storage_parameters = True - demand_profile_2: int | float | list | None = field() + demand_profile_upstream: int | float | list | None = field() dispatch_priority_demand_profile: str = field( - validator=contains(["demand_profile", "demand_profile_2"]), + validator=contains(["demand_profile", "demand_profile_upstream"]), ) n_override_events: int | None = field(default=None) override_events_period: int | str | None = field(default=None) @@ -120,7 +120,7 @@ def __attrs_post_init__(self): ) -class PeakLoadManagementOpenLoopStorageController(StorageOpenLoopControlBase): +class PeakLoadManagementHeuristicOpenLoopStorageController(StorageOpenLoopControlBase): """ Peak-load management storage controller implementing an open-loop control strategy. @@ -142,15 +142,15 @@ def setup(self): During setup: 1. Loads and validates configuration from tech_config and plant_config options 2. Registers OpenMDAO inputs for storage parameters (capacity, charge rates, etc.) - 3. Detects peaks in the demand profile (demand_profile and demand_profile_2) - 4. Merges peaks with demand_profile_2 prioritization if configured + 3. Detects peaks in the demand profile (demand_profile and demand_profile_upstream) + 4. Merges peaks with demand_profile_upstream prioritization if configured 5. Computes time-to-next-peak for each timestep 6. Identifies allowed charging windows based on peak_range configuration Raises: ValueError: If configuration is invalid or required keys are missing """ - self.config = PeakLoadManagementOpenLoopStorageControllerConfig.from_dict( + self.config = PeakLoadManagementHeuristicOpenLoopStorageControllerConfig.from_dict( merge_shared_inputs(self.options["tech_config"]["model_inputs"], "control"), strict=False, additional_cls_name=self.__class__.__name__, @@ -158,12 +158,12 @@ def setup(self): super().setup() if ( - self.config.demand_profile_2 is None - and self.config.dispatch_priority_demand_profile == "demand_profile_2" + self.config.demand_profile_upstream is None + and self.config.dispatch_priority_demand_profile == "demand_profile_upstream" ): raise ( ValueError( - "If demand_profile_2 is None, then dispatch_priority_demand_profile" + "If demand_profile_upstream is None, then dispatch_priority_demand_profile" "must be demand_profile" ) ) @@ -203,13 +203,13 @@ def setup(self): ) # Detect peaks in demand profile 2 (if provided) - if self.config.demand_profile_2 is not None: - demand_profile_2 = self._build_demand_profile_dict( - self.config.demand_profile_2, + if self.config.demand_profile_upstream is not None: + demand_profile_upstream = self._build_demand_profile_dict( + self.config.demand_profile_upstream, self.time_index, ) self.peaks_2_df = self.get_peaks( - demand_profile=demand_profile_2, + demand_profile=demand_profile_upstream, n_override_events=self.config.n_override_events, override_events_period=self.config.override_events_period, min_proximity=self.config.min_peak_proximity, @@ -290,7 +290,7 @@ def compute(self, inputs, outputs): peak_range=self.config.peak_range, ) - if self.config.dispatch_priority_demand_profile == "demand_profile_2": + if self.config.dispatch_priority_demand_profile == "demand_profile_upstream": self.peaks_df = self.merge_peaks(self.peaks_2_df, self.peaks_1_df) else: self.peaks_df = self.merge_peaks(self.peaks_1_df, self.peaks_2_df) @@ -483,7 +483,9 @@ def get_peaks( if not isinstance(demand_profile, dict): raise ValueError("demand_profile must be a dict with 'date_time' and 'demand' keys") - peak_range = PeakLoadManagementOpenLoopStorageController._parse_peak_range(peak_range) + peak_range = PeakLoadManagementHeuristicOpenLoopStorageController._parse_peak_range( + peak_range + ) demand_df = pd.DataFrame(demand_profile) if "date_time" not in demand_df or "demand" not in demand_df: diff --git a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py index b0e2d220c..492510c3c 100644 --- a/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py +++ b/h2integrate/control/control_strategies/storage/test/test_plm_openloop_storage_controller.py @@ -9,7 +9,7 @@ from h2integrate.storage.storage_performance_model import StoragePerformanceModel from h2integrate.control.control_strategies.storage.plm_openloop_storage_controller import ( - PeakLoadManagementOpenLoopStorageController, + PeakLoadManagementHeuristicOpenLoopStorageController, ) @@ -59,7 +59,7 @@ def plant_config_base(): def _controller_without_setup(): """Create a controller instance for testing pure helper methods.""" - return object.__new__(PeakLoadManagementOpenLoopStorageController) + return object.__new__(PeakLoadManagementHeuristicOpenLoopStorageController) @pytest.mark.unit @@ -264,7 +264,7 @@ def test_merge_peaks_with_single_demand_profile_returns_correct_peaks_flags(subt } ) - merged = PeakLoadManagementOpenLoopStorageController.merge_peaks(peaks_1_df, None) + merged = PeakLoadManagementHeuristicOpenLoopStorageController.merge_peaks(peaks_1_df, None) with subtests.test("peak flags unchanged"): assert merged["is_peak"].tolist() == peaks_1_df["is_peak"].tolist() @@ -301,7 +301,7 @@ def test_merge_peaks_profile2_takes_precedence_on_same_day(subtests): } ) - merged = PeakLoadManagementOpenLoopStorageController.merge_peaks( + merged = PeakLoadManagementHeuristicOpenLoopStorageController.merge_peaks( peaks_2_df, peaks_1_df, ) @@ -482,13 +482,13 @@ def test_plm_controller_basic_discharge_before_peak(subtests, tech_config_base, "advance_discharge_period": {"units": "h", "val": 2}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": False, - "demand_profile_2": None, + "demand_profile_upstream": None, "dispatch_priority_demand_profile": "demand_profile", "min_peak_proximity": {"units": "h", "val": 4}, } tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( - "PeakLoadManagementOpenLoopStorageController" + "PeakLoadManagementHeuristicOpenLoopStorageController" ) plant_config = plant_config_base @@ -504,7 +504,7 @@ def test_plm_controller_basic_discharge_before_peak(subtests, tech_config_base, prob.model.add_subsystem( "plm_controller", - PeakLoadManagementOpenLoopStorageController( + PeakLoadManagementHeuristicOpenLoopStorageController( plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] ), promotes=["*"], @@ -564,13 +564,13 @@ def test_plm_controller_respects_soc_bounds(subtests, tech_config_base, plant_co "advance_discharge_period": {"units": "h", "val": 1}, "delay_charge_period": {"units": "h", "val": 1}, "allow_charge_in_peak_range": True, - "demand_profile_2": None, + "demand_profile_upstream": None, "dispatch_priority_demand_profile": "demand_profile", "min_peak_proximity": {"units": "h", "val": 4}, } tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( - "PeakLoadManagementOpenLoopStorageController" + "PeakLoadManagementHeuristicOpenLoopStorageController" ) plant_config = plant_config_base @@ -586,7 +586,7 @@ def test_plm_controller_respects_soc_bounds(subtests, tech_config_base, plant_co prob.model.add_subsystem( "plm_controller", - PeakLoadManagementOpenLoopStorageController( + PeakLoadManagementHeuristicOpenLoopStorageController( plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] ), promotes=["*"], @@ -637,7 +637,7 @@ def test_plm_controller_blocking_charge_in_peak_range( "charge_efficiency": 0.92, "discharge_efficiency": 0.92, "demand_profile": np.full(24, 5.0), - "demand_profile_2": None, + "demand_profile_upstream": None, "peak_range": {"start": peak_window_start, "end": peak_window_end}, "advance_discharge_period": {"units": "h", "val": 3}, "delay_charge_period": {"units": "h", "val": 1}, @@ -647,7 +647,7 @@ def test_plm_controller_blocking_charge_in_peak_range( } tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( - "PeakLoadManagementOpenLoopStorageController" + "PeakLoadManagementHeuristicOpenLoopStorageController" ) plant_config = plant_config_base @@ -662,7 +662,7 @@ def test_plm_controller_blocking_charge_in_peak_range( prob.model.add_subsystem( "plm_controller", - PeakLoadManagementOpenLoopStorageController( + PeakLoadManagementHeuristicOpenLoopStorageController( plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] ), promotes=["*"], @@ -716,7 +716,7 @@ def test_plm_controller_warns_when_requested_charge_exceeds_input( "charge_efficiency": 0.95, "discharge_efficiency": 0.95, "demand_profile": np.full(24, 1.0), - "demand_profile_2": None, + "demand_profile_upstream": None, "peak_range": {"start": "23:00:00", "end": "23:59:59"}, "advance_discharge_period": {"units": "h", "val": 1}, "delay_charge_period": {"units": "h", "val": 1}, @@ -726,7 +726,7 @@ def test_plm_controller_warns_when_requested_charge_exceeds_input( } tech_config["technologies"]["h2_storage"]["control_strategy"]["model"] = ( - "PeakLoadManagementOpenLoopStorageController" + "PeakLoadManagementHeuristicOpenLoopStorageController" ) plant_config = plant_config_base @@ -742,7 +742,7 @@ def test_plm_controller_warns_when_requested_charge_exceeds_input( prob.model.add_subsystem( "plm_controller", - PeakLoadManagementOpenLoopStorageController( + PeakLoadManagementHeuristicOpenLoopStorageController( plant_config=plant_config, tech_config=tech_config["technologies"]["h2_storage"] ), promotes=["*"], diff --git a/h2integrate/core/supported_models.py b/h2integrate/core/supported_models.py index 0135a6eb8..119242242 100644 --- a/h2integrate/core/supported_models.py +++ b/h2integrate/core/supported_models.py @@ -164,7 +164,7 @@ SimpleStorageOpenLoopController, ) from h2integrate.control.control_strategies.storage.plm_openloop_storage_controller import ( - PeakLoadManagementOpenLoopStorageController, + PeakLoadManagementHeuristicOpenLoopStorageController, ) from h2integrate.control.control_rules.storage.pyomo_storage_rule_min_operating_cost import ( PyomoRuleStorageMinOperatingCosts, @@ -281,7 +281,9 @@ # Control "SimpleStorageOpenLoopController": SimpleStorageOpenLoopController, "DemandOpenLoopStorageController": DemandOpenLoopStorageController, - "PeakLoadManagementOpenLoopStorageController": PeakLoadManagementOpenLoopStorageController, + "PeakLoadManagementHeuristicOpenLoopStorageController": ( + PeakLoadManagementHeuristicOpenLoopStorageController + ), "HeuristicLoadFollowingStorageController": HeuristicLoadFollowingStorageController, "OptimizedDispatchStorageController": OptimizedDispatchStorageController, "GenericDemandComponent": GenericDemandComponent, From c527ad771d4efffecb73b5b54c2c3e9db3fce78a Mon Sep 17 00:00:00 2001 From: Jared Thomas Date: Wed, 22 Apr 2026 16:09:55 -0600 Subject: [PATCH 48/49] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66ab83c94..527e18e2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Bugfix for round-trip efficiency handling when calling `check_inputs` around `StoragePerformanceModel` [PR 684](https://github.com/NatLabRockies/H2Integrate/pull/684) - Bugfix. Include nuclear in electricity producing tech list and improve error message for zero-length electricity producing techs in model when electricity is specified as the commodity. [PR 685](https://github.com/NatLabRockies/H2Integrate/pull/685) - Added electricity and water consumption profiles as outputs to the `ECOElectrolyzerPerformanceModel` [PR 690](https://github.com/NatLabRockies/H2Integrate/pull/690) +- Add `PeakLoadManagementHeuristicOpenLoopStorageController` as a storage control strategy. [PR 641](https://github.com/NatLabRockies/H2Integrate/pull/641) ## 0.8 [April 15, 2026] - Updated README and docs intro page with expanded H2I description, reorganized sections, and streamlined installation instructions [PR 677](https://github.com/NatLabRockies/H2Integrate/pull/677) @@ -60,7 +61,6 @@ - Modified CI setup so Windows is temporarily disabled and also so unit, regression, and integration tests are run in separate jobs to speed up testing and provide more information on test failures. [PR 668](https://github.com/NatLabRockies/H2Integrate/pull/668) - Added infrastructure for running models with non-hourly time steps via a class attribute `_time_step_bounds` and sets new time step bounds of 5-minutes to 1-hour for the grid components. [PR 653](https://github.com/NatLabRockies/H2Integrate/pull/653) and [PR 671](https://github.com/NatLabRockies/H2Integrate/pull/671) - Remove demand-related outputs from storage performance models and replace usage with demand components [PR 666](https://github.com/NatLabRockies/H2Integrate/pull/666) -- Adds `PeakLoadManagementHeuristicOpenLoopStorageController` as a storage control strategy. [PR 641](https://github.com/NatLabRockies/H2Integrate/pull/641) ## 0.7.2 [April 9, 2026] From c024eb61ec783e687c17738eedee53282a0331c4 Mon Sep 17 00:00:00 2001 From: John Jasa Date: Wed, 22 Apr 2026 21:11:50 -0600 Subject: [PATCH 49/49] Rename demand_profile_upstream.yaml --- .../{demand_profile_2.yaml => demand_profile_upstream.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/33_peak_load_management/demand_profiles/{demand_profile_2.yaml => demand_profile_upstream.yaml} (100%) diff --git a/examples/33_peak_load_management/demand_profiles/demand_profile_2.yaml b/examples/33_peak_load_management/demand_profiles/demand_profile_upstream.yaml similarity index 100% rename from examples/33_peak_load_management/demand_profiles/demand_profile_2.yaml rename to examples/33_peak_load_management/demand_profiles/demand_profile_upstream.yaml