API Reference¶
This page is generated directly from the docstrings in the pev_synth
source via mkdocstrings. It is the
authoritative reference for the public surface — the names exported in
pev_synth.__all__.
ev-flow on PyPI, pev_synth in Python
Install with pip install ev-flow; import with import pev_synth. Every
symbol below is reachable as pev_synth.<name> (for example
pev_synth.generate_profiles or pev_synth.Fleet).
Package overview¶
pev_synth — Synthetic EV charging dataset pipeline + library API.
Library API (v2.0)
The public surface for downstream code is:
>>> import pev_synth as ps
>>> ps.list_regions()
['bay_area', 'boston', 'chicago', 'dallas_fort_worth', 'la_basin',
'new_york_metro', 'seattle', 'us_national']
>>> ps.list_profile_types()
['residential', 'workplace']
>>> fleet = ps.generate_profiles('residential', n=1000,
... region='bay_area')
>>> prof = fleet[0]
>>> pa = prof.generate_presence_absence('2001-01-01', '2001-01-08')
See src/pev_synth/api.py and docs/pev_synth_api.md for details.
Pipeline modules (M1..M9, methodology v2.0.0, master seed 20260520)
nhts_loader— NHTS 2017 public-use file loader.vehicle_archetypes— N-EV archetype sampler (M2).donor_matcher— NHTS donor-vehicle matcher (M3).travel_week_builder— one-year travel sequence builder (M4).plug_in_model— session plug-in / dwell sampler (M5).soc_trajectory— continuous-time SoC ledger + sessions (M6).hourly_resampler— 15-min + hourly plug-status rasteriser (M7).validation_bounds_curator— bound curation (M8).validator— §10 validation runner + report writer (M9).regions— 8-region registry (Region dataclass)._utc_migration— package-internal v1.1 → v2.0 UTC cache migrator (leading underscore = not part of the public API; used only by in-house callers with a v1.1 cache to upgrade).
The library API wraps the artifacts these modules produce.
Generating fleets¶
The primary entry point is generate_profiles, which draws a reproducible
subset from the local cache and returns a Fleet.
generate_profiles
¶
generate_profiles(
profile_type: ProfileType | str = "residential",
n: int = 1000,
region: Region | str = "bay_area",
seed: int = _DEFAULT_SEED,
data_root: Path | None = None,
*,
replicate_id: int = 0,
r_total: int = 1,
) -> Fleet
Return a :class:Fleet of n EVs of profile_type for region.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
profile_type
|
ProfileType | str
|
|
'residential'
|
n
|
int
|
Number of EVs to return. Must be a positive integer not exceeding
the cached fleet size for the requested |
1000
|
region
|
Region | str
|
Either a :class: |
'bay_area'
|
seed
|
int
|
Master seed for the random subset selection (default
|
_DEFAULT_SEED
|
data_root
|
Path | None
|
Optional override of the per-region cache directory. Useful for tests against ad-hoc bundles. Defaults to the canonical layout. |
None
|
Raises:
| Type | Description |
|---|---|
ValueError
|
|
FileNotFoundError
|
The |
Source code in pev_synth/api.py
1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 | |
regenerate_fleet
¶
regenerate_fleet(
profile_type: ProfileType | str,
n: int,
region: Region | str = "bay_area",
seed: int = _DEFAULT_SEED,
data_root: Path | None = None,
) -> Fleet
Run the heavy M1-M7 pipeline to produce a fresh n-EV bundle.
Stub: not implemented at the api level. The full pipeline runs via
python -m pev_synth.cache_regen one.
Source code in pev_synth/api.py
Fleet¶
A Fleet is a lazy collection of Profile objects backed by
parquet files. Only the static fleet.parquet is read at construction time;
larger artifacts are read on demand. Fleet is iterable, indexable
(fleet[i] / fleet['ev_0042']), and filterable, and exposes wide,
per-EV-column versions of the time-window queries plus a fleet-level
aggregate_load.
Fleet
¶
Fleet(
data_root: Path,
ev_ids: list[int],
profile_type: str,
region: Region,
meta: dict[str, Any] | None = None,
)
A collection of :class:Profile instances backed by parquet files.
Fleet is lazy: only fleet.parquet is read at construction time;
bigger artifacts (plug_status, sessions, mobility) are read on demand
via pyarrow predicate-pushdown by ev_id.
Attributes:
| Name | Type | Description |
|---|---|---|
region |
Region
|
The :class: |
profile_type |
str
|
|
Source code in pev_synth/api.py
by_ev_id
¶
by_ev_id(ev_id: int) -> Profile
Return the Profile for the given ev_id.
Raises KeyError if ev_id is not in this Fleet. Use this
when you want unambiguous by-id lookup; fleet[ev_id] works the
same way only when ev_id is present.
Source code in pev_synth/api.py
by_position
¶
by_position(i: int) -> Profile
Return the i-th Profile in this Fleet (0-indexed positional).
Raises IndexError if i is out of range. Use this when you
want unambiguous positional access; fleet[i] works the same way
only when i is NOT also a valid ev_id in this Fleet.
Source code in pev_synth/api.py
cache_path
staticmethod
¶
cache_path(
region: Region | str,
profile_type: str,
*,
replicate_id: int = 0,
r_total: int = 1,
) -> Path
Resolve the canonical cache directory for one replicate.
RFC-022.r: when r_total > 1 the returned path is
<processed_root>/<region>/<profile_type>_ev_synth/replicates/r{replicate_id}/.
r_total == 1 stays flat (alias r=0) so legacy single-cache
layouts continue to resolve.
Source code in pev_synth/api.py
profile_ids
¶
ev_ids
¶
has_ev
¶
row_for
¶
charging_sessions_for
¶
charging_sessions_for(
ev_ids: list[int],
t_start: str | Timestamp,
t_stop: str | Timestamp,
tz: str | None = None,
) -> DataFrame
Public alias of the per-EV-list session query.
Source code in pev_synth/api.py
presence_absence_one
¶
presence_absence_one(
ev_id: int,
t_start: str | Timestamp,
t_stop: str | Timestamp,
freq: str = "15min",
tz: str | None = None,
) -> Series
Public alias of :meth:_presence_absence_one.
Source code in pev_synth/api.py
read_parquet
¶
read_parquet(
name: str,
columns: list[str] | None = None,
ev_ids: list[int] | None = None,
) -> DataFrame
Public alias of the per-EV-id parquet reader.
summary
¶
One row per EV. Columns include the brief's requested set.
Source code in pev_synth/api.py
filter
¶
filter(**predicates: Any) -> Fleet
Return a new Fleet containing EVs matching the predicates.
Supported keys
archetype: equality (string).powertrain: equality (string, e.g.'BEV').cluster_z: equality (int).evse_brand: equality on the v2.1EVSE_brandcolumn (e.g.'Tesla','ChargePoint').evse_connector: equality on the v2.1EVSE_connectorcolumn (e.g.'J1772','NACS').battery_kwh_gte/battery_kwh_lt/battery_kwh_gt/battery_kwh_lte: numeric thresholds onB_kwh.max_charge_kw_gte/max_charge_kw_lt/ ...
Multiple predicates are AND-combined. Unknown keys raise
KeyError with a list of supported keys.
Source code in pev_synth/api.py
973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 | |
generate_presence_absence
¶
generate_presence_absence(
t_start: str | Timestamp,
t_stop: str | Timestamp,
freq: str = "15min",
tz: str | None = None,
) -> DataFrame
Bool wide matrix: index=timestamps, columns=ev_id.
See :meth:Profile.generate_presence_absence for the time-window
and year-remap rules. tz=None (default) yields a UTC index;
any IANA zone yields the same data on a local-wall-clock index.
Source code in pev_synth/api.py
plug_status
¶
plug_status(
t_start: str | Timestamp,
t_stop: str | Timestamp,
freq: str = "15min",
tz: str | None = None,
) -> DataFrame
Alias of :meth:generate_presence_absence.
Source code in pev_synth/api.py
charging_sessions
¶
charging_sessions(
t_start: str | Timestamp,
t_stop: str | Timestamp,
tz: str | None = None,
) -> DataFrame
Sessions whose [t_in, t_out) intersects the window.
Timestamp columns (t_in, t_out) are returned in tz
(UTC by default).
Source code in pev_synth/api.py
aggregate_load
¶
aggregate_load(
t_start: str | Timestamp,
t_stop: str | Timestamp,
freq: str = "1h",
tz: str | None = None,
) -> Series
Fleet-aggregate charging power (kW).
Charge-asap baseline: each session draws constant max_kw from
t_in until enough wall-energy has flowed to deliver
energy_kwh at efficiency η, then idles. tz=None returns the
UTC index; any IANA zone returns the equivalent local-wall-clock
index.
Source code in pev_synth/api.py
1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 | |
save
¶
Write a self-contained bundle under path/{profile_type}_fleet/.
Contents
fleet.parquet— the static rows for this Fleet's EV subset.plug_status_15min.parquet— subsetted plug-status matrix.sessions.parquet— subsetted sessions.mobility.parquet— subsetted mobility.plug_in_events.parquet— subsetted events (when present).meta.json— bundle metadata:profile_type,region(name + tz), the subset'sev_ids, and any inherited meta.
Source code in pev_synth/api.py
load
classmethod
¶
load(path: str | Path) -> Fleet
Inverse of :meth:save. Accepts either the inner bundle directory
(.../{type}_fleet) or its parent (the latter is convenience).
Source code in pev_synth/api.py
Profile¶
A Profile is a single synthetic EV. Its static attributes (battery,
charge power, archetype, EVSE details) come from one row of the fleet table;
its time-window methods (plug_status, charging_sessions,
soc_trajectory, trips) read the dynamic artifacts lazily.
Profile
¶
Profile(fleet: Fleet, ev_id: int)
One synthetic EV. All data is loaded lazily from the cache.
Public attributes / properties below cover the brief's API surface. The
methods consult fleet.parquet (static), plug_status_15min.parquet
(presence/absence), sessions.parquet (charging sessions),
mobility.parquet (trips). Filters are pushed down to pyarrow so we
never load the full 35M-row table.
All time-window methods accept a tz keyword: tz=None returns the
UTC storage tz; pass region.tz (or any IANA zone) for a local
wall-clock index instead.
Source code in pev_synth/api.py
evse_brand
property
¶
EVSE brand string (e.g. 'Tesla', 'ChargePoint', ...).
See docs/literature_review_evse_specs_us.md for the brand
universe and prior sources.
evse_connector
property
¶
EVSE connector type (e.g. 'J1772', 'NACS',
'Tesla_NACS_native', 'NEMA_14_50', ...).
summary
¶
Per-EV summary Series (one row of the fleet table).
Source code in pev_synth/api.py
generate_presence_absence
¶
generate_presence_absence(
t_start: str | Timestamp,
t_stop: str | Timestamp,
freq: str = "15min",
tz: str | None = None,
) -> Series
Bool plug-in series over [t_start, t_stop) at freq.
Returns a tz-aware pd.Series[bool] indexed by DatetimeIndex.
True means the EV is plugged-in at that timestep.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
t_start
|
str | Timestamp
|
Window endpoints. Tz-naive inputs are localised to
|
required |
t_stop
|
str | Timestamp
|
Window endpoints. Tz-naive inputs are localised to
|
required |
freq
|
str
|
|
'15min'
|
tz
|
str | None
|
|
None
|
Source code in pev_synth/api.py
plug_status
¶
plug_status(
t_start: str | Timestamp,
t_stop: str | Timestamp,
freq: str = "15min",
tz: str | None = None,
) -> Series
Alias of :meth:generate_presence_absence.
Source code in pev_synth/api.py
charging_sessions
¶
charging_sessions(
t_start: str | Timestamp,
t_stop: str | Timestamp,
tz: str | None = None,
) -> DataFrame
Sessions whose [t_in, t_out) intersects the window.
Source code in pev_synth/api.py
soc_trajectory
¶
soc_trajectory(
t_start: str | Timestamp,
t_stop: str | Timestamp,
freq: str = "15min",
tz: str | None = None,
) -> Series
Continuous SoC over [t_start, t_stop) in kWh.
Inside a session, SoC ramps linearly from soc_in_kwh to
soc_target_out_kwh over the session window (constant-power
proxy consistent with the v1 ledger). Between sessions, SoC steps
linearly from the previous soc_target_out down to the next
soc_in (driving discharge).
Source code in pev_synth/api.py
trips
¶
Trips from mobility.parquet overlapping the window.
Timestamp columns (start_ts, end_ts) are returned in the
requested tz (UTC by default).
Source code in pev_synth/api.py
Regions¶
ev-flow models eight US regions. Each Region carries the climate, market and
timezone context that drives the pipeline; the region's tz is the default
local zone applied to timezone-naive t_start / t_stop inputs on every
time-window method.
Region
dataclass
¶
Region(
name: str,
display_name: str,
states: tuple[str, ...],
cbsas: tuple[int, ...],
cdivmsar_filter: tuple[int, ...],
tz: str,
iso_market: ISOMarket,
balancing_authority: str | None = None,
sales_mix_source: str = "",
sales_mix_overlay: tuple[tuple[str, float], ...] = (),
temperature_stations: tuple[str, ...] = (),
income_tier_scheme: str = "acs_national",
winter_f_T_multiplier: float = 1.0,
winter_t_c: float | None = None,
workplace_donor_borrow_states: tuple[str, ...] = (),
heat_pump_share_override: float | None = None,
nhts_vintage_mix: tuple[tuple[str, float], ...] = (
("2017", 1.0),
),
acs_calibration_enabled: bool = False,
acs_pums_vintage: str = "2020-2024",
notes: str = "",
)
One regional slice of the v2.0 EV synthesis pipeline.
Frozen and hashable so a Region can be used as a cache key in
downstream modules (donor matcher, travel-week builder, SoC ledger).
All fields are populated explicitly per plan §2.2; None is only
used for iso_market on the national reference region.
Notes
Citation pointers:
- CBSA codes verified against OMB 2023
list1_2023.xlsx. - Winter f_T multipliers are a linear approximation calibrated against
Yuksel & Michalek (2015) winter uplift, evaluated at the Dec-Mar mean
ambient temperature from NOAA ISD 1991-2020 normals
(formula:
1 + 0.018 * (20 - T_C)). - DFW pickup overlay per Cox Automotive Q4-2024 / Q1-2025 Texas EV registration data.
nhts_vintage_mix_map
property
¶
Read-only Mapping view of :attr:nhts_vintage_mix.
Convenience accessor mirroring :attr:sales_mix_overlay_map. The
underlying storage is a canonical tuple-of-pairs so the frozen
dataclass stays hashable; this property surfaces it as an
immutable MappingProxyType for ergonomic consumer access.
sales_mix_overlay_map
property
¶
Read-only Mapping view of :attr:sales_mix_overlay.
Backed by :class:types.MappingProxyType — in-place mutation
attempts raise TypeError.
from_name
classmethod
¶
from_name(name: str) -> Region
Look up a region by its short name.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Region short name, e.g. |
required |
Returns:
| Type | Description |
|---|---|
Region
|
The matching frozen |
Raises:
| Type | Description |
|---|---|
ValueError
|
If |
Source code in pev_synth/regions.py
list_regions
¶
list_profile_types
¶
Return the supported profile types in v2.0.
fleet_depot was de-scoped in v2.0 and is intentionally absent;
only residential and workplace are supported.
Source code in pev_synth/regions.py
The region registry¶
pev_synth.REGIONS is the canonical mapping of region short-name to Region
instance. The eight registered regions are bay_area, boston, chicago,
dallas_fort_worth, la_basin, new_york_metro, seattle and
us_national. Look one up by name with
Region.from_name or by indexing REGIONS
directly:
import pev_synth as ps
ps.REGIONS['bay_area'].tz # 'America/Los_Angeles'
ps.Region.from_name('seattle').display_name # 'Seattle + Portland'
Plotting¶
Optional matplotlib helpers for visualising fleet
output, in the pev_synth.plotting submodule. They are kept separate from the
core package so plain import pev_synth has no matplotlib dependency — install
the extra with pip install ev-flow[plotting], then
from pev_synth import plotting.
plotting
¶
Optional matplotlib plotting helpers for pev_synth.
This module is not imported by import pev_synth and matplotlib is
not a core dependency. Import the helpers explicitly::
>>> from pev_synth import plotting
>>> ax = plotting.plot_aggregate_load(fleet.plug_status(t0, t1))
and install the optional extra::
pip install ev-flow[plotting]
Each helper operates directly on the DataFrames returned by the public
:class:pev_synth.Fleet / :class:pev_synth.Profile API, so the helpers are
unit-testable without a real on-disk cache:
- :func:
plot_aggregate_loadconsumes the wide plug-status matrix returned by :meth:Fleet.plug_status/ :meth:Fleet.generate_presence_absence(DatetimeIndex×ev_idcolumns of bool). - :func:
plot_plugin_time_distributionand :func:plot_session_energy_distributionconsume the long sessions table returned by :meth:Fleet.charging_sessions(columns includeev_id,t_in,t_out,energy_kwh,max_kw, ...). - :func:
plot_soc_tracesreconstructs per-EV state-of-charge step traces from the sessions table'st_in/t_out/soc_in_kwh/soc_target_out_kwhanchor columns.
Conventions
- matplotlib (and
pyplot) are imported lazily inside each function via :func:_import_pyplot, which raises a friendly :class:ImportErrorwhen the optional extra is missing. - Every helper accepts an optional pre-existing
axand returns the :class:matplotlib.axes.Axesit drew on (creating a fresh figure/axes whenaxisNone). - No helper ever calls
plt.show()— rendering / saving is left to the caller so the helpers stay headless-friendly (e.g. underAgg).
plot_aggregate_load
¶
plot_aggregate_load(
plug_status_df: DataFrame,
ax: Axes | None = None,
*,
freq: str | None = None,
label: str = "plugged-in EVs",
color: str = "#0072B2",
) -> Axes
Plot the fleet-aggregate plugged-in count over time.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
plug_status_df
|
DataFrame
|
Wide boolean plug-status matrix as returned by
:meth: |
required |
ax
|
Axes | None
|
Pre-existing Axes to draw on. A new figure/axes is created when
|
None
|
freq
|
str | None
|
Optional pandas offset alias (e.g. |
None
|
label
|
str
|
Legend label for the drawn line. |
'plugged-in EVs'
|
color
|
str
|
Line color (defaults to a colorblind-safe blue from the Okabe-Ito palette). |
'#0072B2'
|
Returns:
| Type | Description |
|---|---|
Axes
|
The Axes the curve was drawn on. |
Source code in pev_synth/plotting.py
plot_plugin_time_distribution
¶
plot_plugin_time_distribution(
sessions_df: DataFrame,
ax: Axes | None = None,
*,
bins: int = 24,
color: str = "#009E73",
t_in_col: str = "t_in",
) -> Axes
Plot a histogram of charging-session plug-in hour-of-day.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sessions_df
|
DataFrame
|
Long charging-session table as returned by
:meth: |
required |
ax
|
Axes | None
|
Pre-existing Axes to draw on. A new figure/axes is created when
|
None
|
bins
|
int
|
Number of histogram bins spanning |
24
|
color
|
str
|
Bar color (defaults to a colorblind-safe green from the Okabe-Ito palette). |
'#009E73'
|
t_in_col
|
str
|
Name of the plug-in timestamp column (default |
't_in'
|
Returns:
| Type | Description |
|---|---|
Axes
|
The Axes the histogram was drawn on. |
Source code in pev_synth/plotting.py
plot_session_energy_distribution
¶
plot_session_energy_distribution(
sessions_df: DataFrame,
ax: Axes | None = None,
*,
bins: int = 30,
color: str = "#D55E00",
energy_col: str = "energy_kwh",
) -> Axes
Plot a histogram of per-session delivered energy.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sessions_df
|
DataFrame
|
Long charging-session table as returned by
:meth: |
required |
ax
|
Axes | None
|
Pre-existing Axes to draw on. A new figure/axes is created when
|
None
|
bins
|
int
|
Number of histogram bins (default 30). |
30
|
color
|
str
|
Bar color (defaults to a colorblind-safe orange from the Okabe-Ito palette). |
'#D55E00'
|
energy_col
|
str
|
Name of the session-energy column (default |
'energy_kwh'
|
Returns:
| Type | Description |
|---|---|
Axes
|
The Axes the histogram was drawn on. |
Source code in pev_synth/plotting.py
plot_soc_traces
¶
plot_soc_traces(
sessions_df: DataFrame,
ev_ids: list[int] | None = None,
ax: Axes | None = None,
*,
max_traces: int = 5,
ev_id_col: str = "ev_id",
t_in_col: str = "t_in",
t_out_col: str = "t_out",
soc_in_col: str = "soc_in_kwh",
soc_out_col: str = "soc_target_out_kwh",
) -> Axes
Plot per-EV state-of-charge traces reconstructed from sessions.
The :class:pev_synth.Profile API exposes a continuous SoC trajectory only
as a :class:~pandas.Series (:meth:Profile.soc_trajectory), not as a
DataFrame. To stay cache-free and DataFrame-driven, this helper instead
reconstructs a step trace per EV directly from the sessions table's SoC
anchor columns: within each session SoC ramps from soc_in_col to
soc_out_col over [t_in, t_out). This mirrors the in-session ramp of
:meth:Profile.soc_trajectory (the between-session driving discharge is not
drawn, as it is not encoded in the sessions table alone).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sessions_df
|
DataFrame
|
Long charging-session table as returned by
:meth: |
required |
ev_ids
|
list[int] | None
|
Specific |
None
|
ax
|
Axes | None
|
Pre-existing Axes to draw on. A new figure/axes is created when
|
None
|
max_traces
|
int
|
Cap on the number of EV traces drawn (default 5) when |
5
|
ev_id_col
|
str
|
Column-name overrides for the sessions schema. |
'ev_id'
|
t_in_col
|
str
|
Column-name overrides for the sessions schema. |
'ev_id'
|
t_out_col
|
str
|
Column-name overrides for the sessions schema. |
'ev_id'
|
soc_in_col
|
str
|
Column-name overrides for the sessions schema. |
'ev_id'
|
soc_out_col
|
str
|
Column-name overrides for the sessions schema. |
'ev_id'
|
Returns:
| Type | Description |
|---|---|
Axes
|
The Axes the traces were drawn on. |
Source code in pev_synth/plotting.py
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 | |