From 5ad9ec94d01307dd5736e5f85c291492280d41ed Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Fri, 17 May 2024 14:17:01 -0700 Subject: [PATCH 01/20] Use latest lindi --- environments/nwb_benchmarks.yaml | 2 +- src/nwb_benchmarks/core/_streaming.py | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/environments/nwb_benchmarks.yaml b/environments/nwb_benchmarks.yaml index 94a09e4..958c541 100644 --- a/environments/nwb_benchmarks.yaml +++ b/environments/nwb_benchmarks.yaml @@ -16,7 +16,7 @@ dependencies: - aiohttp - remfile - pyshark - - lindi + - lindi>=0.3.5 - hdmf @ git+https://github.com/hdmf-dev/hdmf.git@9b3282aa4999d2922f003f1b79ec7458ea3ddc5e # required until PyNWB propagates changes #- hdmf @ git+https://github.com/hdmf-dev/hdmf.git@expose_aws_region # required until region fix is released - hdmf-zarr diff --git a/src/nwb_benchmarks/core/_streaming.py b/src/nwb_benchmarks/core/_streaming.py index 5deb396..195a739 100644 --- a/src/nwb_benchmarks/core/_streaming.py +++ b/src/nwb_benchmarks/core/_streaming.py @@ -194,12 +194,14 @@ def create_lindi_reference_file_system(s3_url: str, outfile_path: str): """ Create a lindi reference file system JSON cache file for a given HDF5 file on S3 (or locally) - The output_file path should end in the '.lindi.json' extension + The outfile_path path should end in the '.lindi.json' extension """ - # Create a read-only Zarr store as a wrapper for the h5 file - store = lindi.LindiH5ZarrStore.from_file(hdf5_file_name_or_url=s3_url) + # Create the h5py-like client + max_chunks_to_cache = int(1e9) + zarr_store_opts = lindi.LindiH5ZarrStoreOpts(num_dataset_chunks_threshold=max_chunks_to_cache) + client = lindi.LindiH5pyFile.from_hdf5_file(url_or_path=s3_url, zarr_store_opts=zarr_store_opts) # Generate a reference file system and write it to a file - store.write_reference_file_system(output_file_name=outfile_path) + client.write_lindi_file(filename=outfile_path) def read_hdf5_lindi(rfs: Union[dict, str]) -> lindi.LindiH5pyFile: @@ -208,7 +210,7 @@ def read_hdf5_lindi(rfs: Union[dict, str]) -> lindi.LindiH5pyFile: :param rfs: The LINDI reference file system file. This can be a dictionary or a URL or path to a .lindi.json file. """ # Load the h5py-like client for the reference file system - client = lindi.LindiH5pyFile.from_reference_file_system(rfs=rfs) + client = lindi.LindiH5pyFile.from_lindi_file(url_or_path=rfs) return client From 9ee1a60178b0362fd8fc68cad13f3dad782c8c95 Mon Sep 17 00:00:00 2001 From: rly Date: Fri, 17 May 2024 15:33:34 -0700 Subject: [PATCH 02/20] Update to latest pynwb/hdmf --- environments/nwb_benchmarks.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/environments/nwb_benchmarks.yaml b/environments/nwb_benchmarks.yaml index 958c541..f2caf37 100644 --- a/environments/nwb_benchmarks.yaml +++ b/environments/nwb_benchmarks.yaml @@ -9,7 +9,6 @@ dependencies: - asv == 0.6.1 - numba>=0.58.1 # Pin to specific version for cuda import - psutil - - pynwb - dandi - fsspec - requests @@ -17,7 +16,7 @@ dependencies: - remfile - pyshark - lindi>=0.3.5 - - hdmf @ git+https://github.com/hdmf-dev/hdmf.git@9b3282aa4999d2922f003f1b79ec7458ea3ddc5e # required until PyNWB propagates changes - #- hdmf @ git+https://github.com/hdmf-dev/hdmf.git@expose_aws_region # required until region fix is released + - pynwb @ git+https://github.com/NeurodataWithoutBorders/pynwb.git@expose_aws_region # required until region fix is released + - hdmf @ git+https://github.com/hdmf-dev/hdmf.git@expose_aws_region # required until region fix is released - hdmf-zarr - -e .. From 7c124c544e99365dc3d8e6f40235b9dea114ffeb Mon Sep 17 00:00:00 2001 From: rly Date: Fri, 17 May 2024 15:33:53 -0700 Subject: [PATCH 03/20] Add is_staging arg to get_s3_url --- src/nwb_benchmarks/core/_dandi.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/nwb_benchmarks/core/_dandi.py b/src/nwb_benchmarks/core/_dandi.py index 555ee94..f5c96a1 100644 --- a/src/nwb_benchmarks/core/_dandi.py +++ b/src/nwb_benchmarks/core/_dandi.py @@ -1,7 +1,7 @@ from dandi.dandiapi import DandiAPIClient -def get_s3_url(dandiset_id: str, dandi_path: str) -> str: +def get_s3_url(dandiset_id: str, dandi_path: str, is_staging: bool = False) -> str: """ Helper function to get S3 url form that fsspec/remfile expect from basic info about a file on DANDI. @@ -16,7 +16,8 @@ def get_s3_url(dandiset_id: str, dandi_path: str) -> str: """ assert len(dandiset_id) == 6, f"The specified 'dandiset_id' ({dandiset_id}) should be the six-digit identifier." - client = DandiAPIClient() + api_url = "https://api-staging.dandiarchive.org/api" if is_staging else "https://api.dandiarchive.org/api" + client = DandiAPIClient(api_url) dandiset = client.get_dandiset(dandiset_id=dandiset_id) asset = dandiset.get_asset_by_path(path=dandi_path) From ba8d0f3861be9a11b350f3bc08bfdb6a4753baf6 Mon Sep 17 00:00:00 2001 From: rly Date: Fri, 17 May 2024 15:34:07 -0700 Subject: [PATCH 04/20] Add lindi remote rfs test cases --- .../benchmarks/time_remote_file_reading.py | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/nwb_benchmarks/benchmarks/time_remote_file_reading.py b/src/nwb_benchmarks/benchmarks/time_remote_file_reading.py index 26ea8fa..4c7c624 100644 --- a/src/nwb_benchmarks/benchmarks/time_remote_file_reading.py +++ b/src/nwb_benchmarks/benchmarks/time_remote_file_reading.py @@ -44,10 +44,31 @@ # Parameters for LINDI pointing to a remote LINDI reference file system JSON file. I.e., here we do not # to create the JSON but can load it directly from the remote store lindi_remote_rfs_parameter_cases = dict( - # TODO: Just an example case for testing. Replace with real test case - BaseExample=dict( - s3_url="https://kerchunk.neurosift.org/dandi/dandisets/000939/assets/11f512ba-5bcf-4230-a8cb-dc8d36db38cb/zarr.json", + EcephysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.lindi.json", + ), + ), + OphysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.lindi.json", + ), ), + IcephysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", + ), + ), + # TODO: Just an example case for testing. Replace with real test case + # BaseExample=dict( + # s3_url="https://lindi.neurosift.org/dandi/dandisets/000939/assets/56d875d6-a705-48d3-944c-53394a389c85/nwb.lindi.json", + # ), ) From cd04a21ee27c3a5151d22fa26e9be2f3d5da4fc9 Mon Sep 17 00:00:00 2001 From: rly Date: Fri, 17 May 2024 17:51:35 -0700 Subject: [PATCH 05/20] Add AWS_REGION, remove load_namespaces --- docs/writing_benchmarks.rst | 2 +- src/nwb_benchmarks/core/_streaming.py | 23 ++++++++++--------- .../scripts/demo_network_profiling.py | 2 +- .../scripts/reduce_ibl_session.py | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/writing_benchmarks.rst b/docs/writing_benchmarks.rst index 2c14179..f8ef95b 100644 --- a/docs/writing_benchmarks.rst +++ b/docs/writing_benchmarks.rst @@ -112,7 +112,7 @@ Notice how the ``read_hdf5_nwbfile_remfile`` function (which reads an HDF5-backe def read_hdf5_nwbfile_remfile(s3_url: str) -> Tuple[pynwb.NWBFile, pynwb.NWBHDF5IO, h5py.File, remfile.File]: """Read an HDF5 NWB file from an S3 URL using the ROS3 driver from h5py.""" (file, byte_stream) = read_hdf5_remfile(s3_url=s3_url) - io = pynwb.NWBHDF5IO(file=file, load_namespaces=True) + io = pynwb.NWBHDF5IO(file=file, aws_region="us-east-2") nwbfile = io.read() return (nwbfile, io, file, byte_stream) diff --git a/src/nwb_benchmarks/core/_streaming.py b/src/nwb_benchmarks/core/_streaming.py index 195a739..4e1fa91 100644 --- a/src/nwb_benchmarks/core/_streaming.py +++ b/src/nwb_benchmarks/core/_streaming.py @@ -24,6 +24,8 @@ warnings.filterwarnings(action="ignore", message="No cached namespaces found in .*") warnings.filterwarnings(action="ignore", message="Ignoring cached namespace .*") +AWS_REGION = "us-east-2" + def read_hdf5_fsspec_no_cache( s3_url: str, @@ -34,7 +36,7 @@ def read_hdf5_fsspec_no_cache( filesystem = fsspec.filesystem("https") byte_stream = filesystem.open(path=s3_url, mode="rb") - file = h5py.File(name=byte_stream) + file = h5py.File(name=byte_stream, aws_region=AWS_REGION) return (file, byte_stream) @@ -60,7 +62,7 @@ def read_hdf5_nwbfile_fsspec_no_cache( ) -> Tuple[pynwb.NWBFile, pynwb.NWBHDF5IO, h5py.File, HTTPFile]: """Read an HDF5 NWB file from an S3 URL using fsspec without a cache.""" (file, byte_stream) = read_hdf5_fsspec_no_cache(s3_url=s3_url) - io = pynwb.NWBHDF5IO(file=file, load_namespaces=True) + io = pynwb.NWBHDF5IO(file=file) nwbfile = io.read() return (nwbfile, io, file, byte_stream) @@ -70,7 +72,7 @@ def read_hdf5_nwbfile_fsspec_with_cache( ) -> Tuple[pynwb.NWBFile, pynwb.NWBHDF5IO, h5py.File, HTTPFile, tempfile.TemporaryDirectory]: """Read an HDF5 NWB file from an S3 URL using fsspec without a cache.""" (file, byte_stream, tmpdir) = read_hdf5_fsspec_with_cache(s3_url=s3_url) - io = pynwb.NWBHDF5IO(file=file, load_namespaces=True) + io = pynwb.NWBHDF5IO(file=file) nwbfile = io.read() return (nwbfile, io, file, byte_stream, tmpdir) @@ -83,9 +85,9 @@ def read_hdf5_remfile(s3_url: str) -> Tuple[h5py.File, remfile.File]: def read_hdf5_nwbfile_remfile(s3_url: str) -> Tuple[pynwb.NWBFile, pynwb.NWBHDF5IO, h5py.File, remfile.File]: - """Read an HDF5 NWB file from an S3 URL using the ROS3 driver from h5py.""" + """Read an HDF5 NWB file from an S3 URL using remfile.""" (file, byte_stream) = read_hdf5_remfile(s3_url=s3_url) - io = pynwb.NWBHDF5IO(file=file, load_namespaces=True) + io = pynwb.NWBHDF5IO(file=file) nwbfile = io.read() return (nwbfile, io, file, byte_stream) @@ -102,9 +104,9 @@ def read_hdf5_remfile_with_cache(s3_url: str) -> Tuple[h5py.File, remfile.File, def read_hdf5_nwbfile_remfile_with_cache( s3_url: str, ) -> Tuple[pynwb.NWBFile, pynwb.NWBHDF5IO, h5py.File, remfile.File, tempfile.TemporaryDirectory]: - """Read an HDF5 NWB file from an S3 URL using the ROS3 driver from h5py.""" + """Read an HDF5 NWB file from an S3 URL using remfile.""" (file, byte_stream, tmpdir) = read_hdf5_remfile_with_cache(s3_url=s3_url) - io = pynwb.NWBHDF5IO(file=file, load_namespaces=True) + io = pynwb.NWBHDF5IO(file=file) nwbfile = io.read() return (nwbfile, io, file, byte_stream, tmpdir) @@ -154,14 +156,13 @@ def read_hdf5_ros3(s3_url: str, retry: bool = True) -> Tuple[h5py.File, Union[in The number of retries, if `retry` is `True`. """ ros3_form = s3_url.replace("https://dandiarchive.s3.amazonaws.com", "s3://dandiarchive") - aws_region = bytes("us-east-2", "ascii") # TODO: generalize this as an argument if necessary if retry: file, retries = robust_ros3_read( - command=h5py.File, command_kwargs=dict(name=ros3_form, driver="ros3", aws_region=aws_region) + command=h5py.File, command_kwargs=dict(name=ros3_form, driver="ros3", aws_region=AWS_REGION) ) else: retries = None - file = h5py.File(name=ros3_form, driver="ros3", aws_region=aws_region) + file = h5py.File(name=ros3_form, driver="ros3", aws_region=AWS_REGION) return (file, retries) @@ -180,7 +181,7 @@ def read_hdf5_nwbfile_ros3(s3_url: str, retry: bool = True) -> Tuple[pynwb.NWBFi The number of retries, if `retry` is `True`. """ ros3_form = s3_url.replace("https://dandiarchive.s3.amazonaws.com", "s3://dandiarchive") - io = pynwb.NWBHDF5IO(path=ros3_form, mode="r", load_namespaces=True, driver="ros3") + io = pynwb.NWBHDF5IO(path=ros3_form, mode="r", driver="ros3", aws_region=AWS_REGION) if retry: nwbfile, retries = robust_ros3_read(command=io.read) diff --git a/src/nwb_benchmarks/scripts/demo_network_profiling.py b/src/nwb_benchmarks/scripts/demo_network_profiling.py index 560b69d..1666167 100644 --- a/src/nwb_benchmarks/scripts/demo_network_profiling.py +++ b/src/nwb_benchmarks/scripts/demo_network_profiling.py @@ -15,7 +15,7 @@ # Read the NWB data file from DANDI s3_path = "https://dandiarchive.s3.amazonaws.com/ros3test.nwb" with network_activity_tracker(tshark_path=tshark_path) as network_tracker: - with pynwb.NWBHDF5IO(s3_path, mode="r", driver="ros3") as io: + with pynwb.NWBHDF5IO(s3_path, mode="r", driver="ros3", aws_region="us-east-2") as io: nwbfile = io.read() test_data = nwbfile.acquisition["ts_name"].data[:] diff --git a/src/nwb_benchmarks/scripts/reduce_ibl_session.py b/src/nwb_benchmarks/scripts/reduce_ibl_session.py index e5a9965..8a7b92a 100644 --- a/src/nwb_benchmarks/scripts/reduce_ibl_session.py +++ b/src/nwb_benchmarks/scripts/reduce_ibl_session.py @@ -14,7 +14,7 @@ hdf5_benchmark_dandiset_folder = pathlib.Path("E:/nwb_benchmark_data/000717") # Path to your local copy of 000717 # Read source NWBFile -io = pynwb.NWBHDF5IO(path=original_file_path, mode="r", load_namespaces=True) +io = pynwb.NWBHDF5IO(path=original_file_path, mode="r") source_nwbfile = io.read() session_id = source_nwbfile.session_id.split("-")[0] # Shorten for readability; should still be enough to be unique From 310f94c19aa730a89a876af6a4869b47a0533ee2 Mon Sep 17 00:00:00 2001 From: rly Date: Fri, 17 May 2024 17:54:53 -0700 Subject: [PATCH 06/20] Fix --- docs/writing_benchmarks.rst | 2 +- src/nwb_benchmarks/core/_streaming.py | 2 +- src/nwb_benchmarks/scripts/demo_network_profiling.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/writing_benchmarks.rst b/docs/writing_benchmarks.rst index f8ef95b..f4b04e2 100644 --- a/docs/writing_benchmarks.rst +++ b/docs/writing_benchmarks.rst @@ -112,7 +112,7 @@ Notice how the ``read_hdf5_nwbfile_remfile`` function (which reads an HDF5-backe def read_hdf5_nwbfile_remfile(s3_url: str) -> Tuple[pynwb.NWBFile, pynwb.NWBHDF5IO, h5py.File, remfile.File]: """Read an HDF5 NWB file from an S3 URL using the ROS3 driver from h5py.""" (file, byte_stream) = read_hdf5_remfile(s3_url=s3_url) - io = pynwb.NWBHDF5IO(file=file, aws_region="us-east-2") + io = pynwb.NWBHDF5IO(file=file, aws_region=bytes("us-east-2", "ascii")) nwbfile = io.read() return (nwbfile, io, file, byte_stream) diff --git a/src/nwb_benchmarks/core/_streaming.py b/src/nwb_benchmarks/core/_streaming.py index 4e1fa91..2cbae21 100644 --- a/src/nwb_benchmarks/core/_streaming.py +++ b/src/nwb_benchmarks/core/_streaming.py @@ -24,7 +24,7 @@ warnings.filterwarnings(action="ignore", message="No cached namespaces found in .*") warnings.filterwarnings(action="ignore", message="Ignoring cached namespace .*") -AWS_REGION = "us-east-2" +AWS_REGION = bytes("us-east-2", "ascii") def read_hdf5_fsspec_no_cache( diff --git a/src/nwb_benchmarks/scripts/demo_network_profiling.py b/src/nwb_benchmarks/scripts/demo_network_profiling.py index 1666167..f6d6b88 100644 --- a/src/nwb_benchmarks/scripts/demo_network_profiling.py +++ b/src/nwb_benchmarks/scripts/demo_network_profiling.py @@ -15,7 +15,7 @@ # Read the NWB data file from DANDI s3_path = "https://dandiarchive.s3.amazonaws.com/ros3test.nwb" with network_activity_tracker(tshark_path=tshark_path) as network_tracker: - with pynwb.NWBHDF5IO(s3_path, mode="r", driver="ros3", aws_region="us-east-2") as io: + with pynwb.NWBHDF5IO(s3_path, mode="r", driver="ros3", aws_region=bytes("us-east-2", "ascii")) as io: nwbfile = io.read() test_data = nwbfile.acquisition["ts_name"].data[:] From 7794d753541b98c98f03525e9d7d03b7641ebc5f Mon Sep 17 00:00:00 2001 From: rly Date: Fri, 17 May 2024 18:16:31 -0700 Subject: [PATCH 07/20] Add remote slicing params, copy params to network --- .../network_tracking_remote_file_reading.py | 27 +++++++++++-- .../network_tracking_remote_slicing.py | 38 ++++++++++++++++--- .../benchmarks/time_remote_slicing.py | 37 +++++++++++++++--- 3 files changed, 89 insertions(+), 13 deletions(-) diff --git a/src/nwb_benchmarks/benchmarks/network_tracking_remote_file_reading.py b/src/nwb_benchmarks/benchmarks/network_tracking_remote_file_reading.py index 3d3e425..f7ebf9f 100644 --- a/src/nwb_benchmarks/benchmarks/network_tracking_remote_file_reading.py +++ b/src/nwb_benchmarks/benchmarks/network_tracking_remote_file_reading.py @@ -48,10 +48,31 @@ # Parameters for LINDI pointing to a remote LINDI reference file system JSON file. I.e., here we do not # to create the JSON but can load it directly from the remote store lindi_remote_rfs_parameter_cases = dict( - # TODO: Just an example case for testing. Replace with real test case - BaseExample=dict( - s3_url="https://kerchunk.neurosift.org/dandi/dandisets/000939/assets/11f512ba-5bcf-4230-a8cb-dc8d36db38cb/zarr.json", + EcephysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.lindi.json", + ), + ), + OphysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.lindi.json", + ), ), + IcephysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", + ), + ), + # TODO: Just an example case for testing. Replace with real test case + # BaseExample=dict( + # s3_url="https://lindi.neurosift.org/dandi/dandisets/000939/assets/56d875d6-a705-48d3-944c-53394a389c85/nwb.lindi.json", + # ), ) diff --git a/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py b/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py index 3a2c439..469b745 100644 --- a/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py +++ b/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py @@ -33,13 +33,41 @@ # Parameters for LINDI pointing to a remote LINDI reference file system JSON file. I.e., here we do not # to create the JSON but can load it directly from the remote store +# Parameters for LINDI pointing to a remote LINDI reference file system JSON file lindi_remote_rfs_parameter_cases = dict( - # TODO: Just an example case for testing. Replace with real test case - BaseExample=dict( - s3_url="https://kerchunk.neurosift.org/dandi/dandisets/000939/assets/11f512ba-5bcf-4230-a8cb-dc8d36db38cb/zarr.json", - object_name="accelerometer", - slice_range=(slice(0, 30_000), slice(0, 3)), + EcephysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.lindi.json", + ), + object_name="ElectricalSeriesAp", + slice_range=(slice(0, 30_000), slice(0, 384)), + ), + OphysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.lindi.json", + ), + object_name="TwoPhotonSeries", + slice_range=(slice(0, 3), slice(0, 796), slice(0, 512)), + ), + IcephysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", + ), + object_name="data_00002_AD0", + slice_range=(slice(0, 30_000), ), ), + # # TODO: Just an example case for testing. Replace with real test case + # BaseExample=dict( + # s3_url="https://kerchunk.neurosift.org/dandi/dandisets/000939/assets/11f512ba-5bcf-4230-a8cb-dc8d36db38cb/zarr.json", + # object_name="accelerometer", + # slice_range=(slice(0, 30_000), slice(0, 3)), + # ), ) diff --git a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py index f9a17fb..1ed169e 100644 --- a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py +++ b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py @@ -42,12 +42,39 @@ # Parameters for LINDI pointing to a remote LINDI reference file system JSON file lindi_remote_rfs_parameter_cases = dict( - # TODO: Just an example case for testing. Replace with real test case - BaseExample=dict( - s3_url="https://kerchunk.neurosift.org/dandi/dandisets/000939/assets/11f512ba-5bcf-4230-a8cb-dc8d36db38cb/zarr.json", - object_name="accelerometer", - slice_range=(slice(0, 30_000), slice(0, 3)), + EcephysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.lindi.json", + ), + object_name="ElectricalSeriesAp", + slice_range=(slice(0, 30_000), slice(0, 384)), + ), + OphysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.lindi.json", + ), + object_name="TwoPhotonSeries", + slice_range=(slice(0, 3), slice(0, 796), slice(0, 512)), + ), + IcephysTestCase=dict( + s3_url=get_s3_url( + is_staging=True, + dandiset_id="213889", + dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", + ), + object_name="data_00002_AD0", + slice_range=(slice(0, 30_000), ), ), + # # TODO: Just an example case for testing. Replace with real test case + # BaseExample=dict( + # s3_url="https://kerchunk.neurosift.org/dandi/dandisets/000939/assets/11f512ba-5bcf-4230-a8cb-dc8d36db38cb/zarr.json", + # object_name="accelerometer", + # slice_range=(slice(0, 30_000), slice(0, 3)), + # ), ) From 987875c61ef7554fe59700b78584ff679c470c82 Mon Sep 17 00:00:00 2001 From: rly Date: Fri, 17 May 2024 18:26:08 -0700 Subject: [PATCH 08/20] Fix region --- docs/writing_benchmarks.rst | 2 +- src/nwb_benchmarks/core/_streaming.py | 8 ++++---- src/nwb_benchmarks/scripts/demo_network_profiling.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/writing_benchmarks.rst b/docs/writing_benchmarks.rst index f4b04e2..f8ef95b 100644 --- a/docs/writing_benchmarks.rst +++ b/docs/writing_benchmarks.rst @@ -112,7 +112,7 @@ Notice how the ``read_hdf5_nwbfile_remfile`` function (which reads an HDF5-backe def read_hdf5_nwbfile_remfile(s3_url: str) -> Tuple[pynwb.NWBFile, pynwb.NWBHDF5IO, h5py.File, remfile.File]: """Read an HDF5 NWB file from an S3 URL using the ROS3 driver from h5py.""" (file, byte_stream) = read_hdf5_remfile(s3_url=s3_url) - io = pynwb.NWBHDF5IO(file=file, aws_region=bytes("us-east-2", "ascii")) + io = pynwb.NWBHDF5IO(file=file, aws_region="us-east-2") nwbfile = io.read() return (nwbfile, io, file, byte_stream) diff --git a/src/nwb_benchmarks/core/_streaming.py b/src/nwb_benchmarks/core/_streaming.py index 2cbae21..820fe1e 100644 --- a/src/nwb_benchmarks/core/_streaming.py +++ b/src/nwb_benchmarks/core/_streaming.py @@ -24,7 +24,7 @@ warnings.filterwarnings(action="ignore", message="No cached namespaces found in .*") warnings.filterwarnings(action="ignore", message="Ignoring cached namespace .*") -AWS_REGION = bytes("us-east-2", "ascii") +AWS_REGION = "us-east-2" # DANDI is hosted on us-east-2 def read_hdf5_fsspec_no_cache( @@ -36,7 +36,7 @@ def read_hdf5_fsspec_no_cache( filesystem = fsspec.filesystem("https") byte_stream = filesystem.open(path=s3_url, mode="rb") - file = h5py.File(name=byte_stream, aws_region=AWS_REGION) + file = h5py.File(name=byte_stream, aws_region=bytes(AWS_REGION, "ascii")) return (file, byte_stream) @@ -158,11 +158,11 @@ def read_hdf5_ros3(s3_url: str, retry: bool = True) -> Tuple[h5py.File, Union[in ros3_form = s3_url.replace("https://dandiarchive.s3.amazonaws.com", "s3://dandiarchive") if retry: file, retries = robust_ros3_read( - command=h5py.File, command_kwargs=dict(name=ros3_form, driver="ros3", aws_region=AWS_REGION) + command=h5py.File, command_kwargs=dict(name=ros3_form, driver="ros3", aws_region=bytes(AWS_REGION, "ascii")) ) else: retries = None - file = h5py.File(name=ros3_form, driver="ros3", aws_region=AWS_REGION) + file = h5py.File(name=ros3_form, driver="ros3", aws_region=bytes(AWS_REGION, "ascii")) return (file, retries) diff --git a/src/nwb_benchmarks/scripts/demo_network_profiling.py b/src/nwb_benchmarks/scripts/demo_network_profiling.py index f6d6b88..1666167 100644 --- a/src/nwb_benchmarks/scripts/demo_network_profiling.py +++ b/src/nwb_benchmarks/scripts/demo_network_profiling.py @@ -15,7 +15,7 @@ # Read the NWB data file from DANDI s3_path = "https://dandiarchive.s3.amazonaws.com/ros3test.nwb" with network_activity_tracker(tshark_path=tshark_path) as network_tracker: - with pynwb.NWBHDF5IO(s3_path, mode="r", driver="ros3", aws_region=bytes("us-east-2", "ascii")) as io: + with pynwb.NWBHDF5IO(s3_path, mode="r", driver="ros3", aws_region="us-east-2") as io: nwbfile = io.read() test_data = nwbfile.acquisition["ts_name"].data[:] From a9ef8494488be7a40dc39ebe25542db9f5cec278 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 18 May 2024 01:26:20 +0000 Subject: [PATCH 09/20] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../benchmarks/network_tracking_remote_slicing.py | 2 +- src/nwb_benchmarks/benchmarks/time_remote_slicing.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py b/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py index 469b745..ff702f5 100644 --- a/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py +++ b/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py @@ -60,7 +60,7 @@ dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", ), object_name="data_00002_AD0", - slice_range=(slice(0, 30_000), ), + slice_range=(slice(0, 30_000),), ), # # TODO: Just an example case for testing. Replace with real test case # BaseExample=dict( diff --git a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py index 1ed169e..a703016 100644 --- a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py +++ b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py @@ -67,7 +67,7 @@ dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", ), object_name="data_00002_AD0", - slice_range=(slice(0, 30_000), ), + slice_range=(slice(0, 30_000),), ), # # TODO: Just an example case for testing. Replace with real test case # BaseExample=dict( From 8792de268f145f7c964c62b640dd773155204c22 Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sat, 18 May 2024 12:16:06 -0400 Subject: [PATCH 10/20] dandi improvement --- src/nwb_benchmarks/command_line_interface.py | 25 +++++++++++++------- src/nwb_benchmarks/core/_dandi.py | 10 +++++--- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/nwb_benchmarks/command_line_interface.py b/src/nwb_benchmarks/command_line_interface.py index 78205c0..347cb11 100644 --- a/src/nwb_benchmarks/command_line_interface.py +++ b/src/nwb_benchmarks/command_line_interface.py @@ -3,8 +3,10 @@ import locale import os import pathlib +import shutil import subprocess import sys +import warnings from .setup import customize_asv_machine_file, reduce_results @@ -26,6 +28,19 @@ def main() -> None: default_asv_machine_file_path = pathlib.Path.home() / ".asv-machine.json" if command == "run": + asv_root = pathlib.Path(__file__).parent.parent.parent / ".asv" + asv_root.mkdir(exist_ok=True) + intermediate_results_folder = asv_root / "intermediate_results" + + if intermediate_results_folder.exists(): + try: + shutil.rmtree(path=intermediate_results_folder) + except PermissionError: + raise FileExistsError( + f"Unable to auotmatically remove {intermediate_results_folder} - please manually delete and " + "try to run the benchmarks again." + ) + aws_machine_process = subprocess.Popen(["asv", "machine", "--yes"], stdout=subprocess.PIPE) aws_machine_process.wait() customize_asv_machine_file(file_path=default_asv_machine_file_path) @@ -34,9 +49,6 @@ def main() -> None: # Save latest environment list from conda (most thorough) # subprocess tends to have issues inheriting `conda` entrypoint - asv_root = pathlib.Path(__file__).parent.parent.parent / ".asv" - asv_root.mkdir(exist_ok=True) - raw_environment_info_file_path = asv_root / ".raw_environment_info.txt" with open(file=raw_environment_info_file_path, mode="w") as stdout: environment_info_process = subprocess.Popen(args=["conda", "list"], stdout=stdout, shell=True) @@ -70,16 +82,13 @@ def main() -> None: # Consider the raw ASV output as 'intermediate' and perform additional parsing globbed_json_file_paths = [ path - for path in pathlib.Path(asv_root / "intermediate_results").rglob("*.json") + for path in intermediate_results_folder.rglob("*.json") if not any(path.stem == skip_stems for skip_stems in ["benchmarks", "machine"]) ] assert ( len(globbed_json_file_paths) > 0 ), "No intermediate result was found, likely as a result of a failure in the benchmarks." - assert len(globbed_json_file_paths) == 1, ( - "A single intermediate result was not found, likely as a result of a previous failure to reduce " - "the results! Please manually remove these." - ) + assert len(globbed_json_file_paths) == 1, "A single intermediate result was not found, please raise an issue." raw_results_file_path = globbed_json_file_paths[0] reduce_results( diff --git a/src/nwb_benchmarks/core/_dandi.py b/src/nwb_benchmarks/core/_dandi.py index f5c96a1..b62fd6e 100644 --- a/src/nwb_benchmarks/core/_dandi.py +++ b/src/nwb_benchmarks/core/_dandi.py @@ -1,7 +1,7 @@ from dandi.dandiapi import DandiAPIClient -def get_s3_url(dandiset_id: str, dandi_path: str, is_staging: bool = False) -> str: +def get_s3_url(dandiset_id: str, dandi_path: str) -> str: """ Helper function to get S3 url form that fsspec/remfile expect from basic info about a file on DANDI. @@ -16,8 +16,12 @@ def get_s3_url(dandiset_id: str, dandi_path: str, is_staging: bool = False) -> s """ assert len(dandiset_id) == 6, f"The specified 'dandiset_id' ({dandiset_id}) should be the six-digit identifier." - api_url = "https://api-staging.dandiarchive.org/api" if is_staging else "https://api.dandiarchive.org/api" - client = DandiAPIClient(api_url) + api_url = ( + "https://api-staging.dandiarchive.org/api" + if int(dandiset_id) >= 200_000 + else "https://api.dandiarchive.org/api" + ) + client = DandiAPIClient(api_url=api_url) dandiset = client.get_dandiset(dandiset_id=dandiset_id) asset = dandiset.get_asset_by_path(path=dandi_path) From b187b29e22746345711a3d9489d45ff1e7b3a757 Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sat, 18 May 2024 12:16:35 -0400 Subject: [PATCH 11/20] dandi improvement --- src/nwb_benchmarks/core/_dandi.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/nwb_benchmarks/core/_dandi.py b/src/nwb_benchmarks/core/_dandi.py index b62fd6e..eb5701e 100644 --- a/src/nwb_benchmarks/core/_dandi.py +++ b/src/nwb_benchmarks/core/_dandi.py @@ -16,11 +16,11 @@ def get_s3_url(dandiset_id: str, dandi_path: str) -> str: """ assert len(dandiset_id) == 6, f"The specified 'dandiset_id' ({dandiset_id}) should be the six-digit identifier." - api_url = ( - "https://api-staging.dandiarchive.org/api" - if int(dandiset_id) >= 200_000 - else "https://api.dandiarchive.org/api" - ) + if int(dandiset_id) >= 200_000: + api_url = "https://api-staging.dandiarchive.org/api" + else: + api_url = "https://api.dandiarchive.org/api" + client = DandiAPIClient(api_url=api_url) dandiset = client.get_dandiset(dandiset_id=dandiset_id) asset = dandiset.get_asset_by_path(path=dandi_path) From 53c006cc437ff9a560ffd83460ba75e421b2b03a Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sat, 18 May 2024 12:17:56 -0400 Subject: [PATCH 12/20] remove from benchmarks --- .../benchmarks/network_tracking_remote_file_reading.py | 3 --- .../benchmarks/network_tracking_remote_slicing.py | 3 --- src/nwb_benchmarks/benchmarks/time_remote_file_reading.py | 3 --- src/nwb_benchmarks/benchmarks/time_remote_slicing.py | 3 --- 4 files changed, 12 deletions(-) diff --git a/src/nwb_benchmarks/benchmarks/network_tracking_remote_file_reading.py b/src/nwb_benchmarks/benchmarks/network_tracking_remote_file_reading.py index f7ebf9f..53576fc 100644 --- a/src/nwb_benchmarks/benchmarks/network_tracking_remote_file_reading.py +++ b/src/nwb_benchmarks/benchmarks/network_tracking_remote_file_reading.py @@ -50,21 +50,18 @@ lindi_remote_rfs_parameter_cases = dict( EcephysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.lindi.json", ), ), OphysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.lindi.json", ), ), IcephysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", ), diff --git a/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py b/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py index ff702f5..a9aa62a 100644 --- a/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py +++ b/src/nwb_benchmarks/benchmarks/network_tracking_remote_slicing.py @@ -37,7 +37,6 @@ lindi_remote_rfs_parameter_cases = dict( EcephysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.lindi.json", ), @@ -46,7 +45,6 @@ ), OphysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.lindi.json", ), @@ -55,7 +53,6 @@ ), IcephysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", ), diff --git a/src/nwb_benchmarks/benchmarks/time_remote_file_reading.py b/src/nwb_benchmarks/benchmarks/time_remote_file_reading.py index 4c7c624..b20c813 100644 --- a/src/nwb_benchmarks/benchmarks/time_remote_file_reading.py +++ b/src/nwb_benchmarks/benchmarks/time_remote_file_reading.py @@ -46,21 +46,18 @@ lindi_remote_rfs_parameter_cases = dict( EcephysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.lindi.json", ), ), OphysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.lindi.json", ), ), IcephysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", ), diff --git a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py index a703016..7d6e55f 100644 --- a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py +++ b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py @@ -44,7 +44,6 @@ lindi_remote_rfs_parameter_cases = dict( EcephysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.lindi.json", ), @@ -53,7 +52,6 @@ ), OphysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.lindi.json", ), @@ -62,7 +60,6 @@ ), IcephysTestCase=dict( s3_url=get_s3_url( - is_staging=True, dandiset_id="213889", dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.lindi.json", ), From 2e9a5fab6cee813f6a1b6d15787fffbdb5aa0b83 Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sat, 18 May 2024 12:46:14 -0400 Subject: [PATCH 13/20] some results --- ...f3abc58d3f9487dc3b25977d808fc1536e53f.json | 915 ++++++++++++++++++ ...f3abc58d3f9487dc3b25977d808fc1536e53f.json | 319 ++++++ 2 files changed, 1234 insertions(+) create mode 100644 results/info_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json create mode 100644 results/results_timestamp-2024-05-18-12-17-56_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json diff --git a/results/info_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json b/results/info_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json new file mode 100644 index 0000000..ceb89fd --- /dev/null +++ b/results/info_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json @@ -0,0 +1,915 @@ +{ + "3.11.7 | packaged by Anaconda, Inc. | (main, Dec 15 2023, 18:05:47) [MSC v.1916 64 bit (AMD64)]": [ + { + "name": "aiobotocore", + "version": "2.13.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "aiohttp", + "version": "3.9.5", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "aioitertools", + "version": "0.11.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "aiosignal", + "version": "1.3.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "annotated-types", + "version": "0.6.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "appdirs", + "version": "1.4.4", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "arrow", + "version": "1.3.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "asciitree", + "version": "0.3.3", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "asttokens", + "version": "2.4.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "asv", + "version": "0.6.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "asv-runner", + "version": "0.2.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "attrs", + "version": "23.2.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "backports-tarfile", + "version": "1.1.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "bidsschematools", + "version": "0.7.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "blas", + "version": "1.0", + "build": "mkl" + }, + { + "name": "botocore", + "version": "1.34.106", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "bzip2", + "version": "1.0.8", + "build": "h2bbff1b_6" + }, + { + "name": "ca-certificates", + "version": "2024.3.11", + "build": "haa95532_0" + }, + { + "name": "cached-property", + "version": "1.5.2", + "build": "py_0" + }, + { + "name": "certifi", + "version": "2024.2.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "cfgv", + "version": "3.4.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "charset-normalizer", + "version": "3.3.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "ci-info", + "version": "0.3.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "click", + "version": "8.1.7", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "click-didyoumean", + "version": "0.3.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "colorama", + "version": "0.4.6", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "dandi", + "version": "0.62.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "dandischema", + "version": "0.10.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "decorator", + "version": "5.1.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "distlib", + "version": "0.3.8", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "dnspython", + "version": "2.6.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "email-validator", + "version": "2.1.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "etelemetry", + "version": "0.3.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "executing", + "version": "2.0.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "fasteners", + "version": "0.19", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "filelock", + "version": "3.14.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "fqdn", + "version": "1.5.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "frozenlist", + "version": "1.4.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "fscacher", + "version": "0.4.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "fsspec", + "version": "2024.5.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "git", + "version": "2.40.1", + "build": "haa95532_1" + }, + { + "name": "h5py", + "version": "3.11.0", + "build": "nompi_py311h67016bb_101", + "channel": "conda-forge" + }, + { + "name": "hdf5", + "version": "1.14.3", + "build": "nompi_h73e8ff5_101", + "channel": "conda-forge" + }, + { + "name": "hdmf", + "version": "3.13.1.dev31+g9a469cf", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "hdmf-zarr", + "version": "0.7.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "humanize", + "version": "4.9.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "identify", + "version": "2.5.36", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "idna", + "version": "3.7", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "importlib-metadata", + "version": "7.1.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "intel-openmp", + "version": "2023.1.0", + "build": "h59b6b97_46320" + }, + { + "name": "interleave", + "version": "0.2.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "ipython", + "version": "8.24.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "isodate", + "version": "0.6.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "isoduration", + "version": "20.11.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "jaraco-classes", + "version": "3.4.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "jaraco-context", + "version": "5.3.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "jaraco-functools", + "version": "4.0.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "jedi", + "version": "0.19.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "jmespath", + "version": "1.0.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "joblib", + "version": "1.4.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "json5", + "version": "0.9.25", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "jsonpointer", + "version": "2.4", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "jsonschema", + "version": "4.22.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "jsonschema-specifications", + "version": "2023.12.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "keyring", + "version": "25.2.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "keyrings-alt", + "version": "5.0.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "libaec", + "version": "1.1.3", + "build": "h63175ca_0", + "channel": "conda-forge" + }, + { + "name": "libcurl", + "version": "8.7.1", + "build": "h86230a5_0" + }, + { + "name": "libffi", + "version": "3.4.4", + "build": "hd77b12b_1" + }, + { + "name": "libssh2", + "version": "1.11.0", + "build": "h291bd65_0" + }, + { + "name": "libzlib", + "version": "1.2.13", + "build": "hcfcfb64_5", + "channel": "conda-forge" + }, + { + "name": "lindi", + "version": "0.3.5", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "llvmlite", + "version": "0.42.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "lxml", + "version": "5.2.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "matplotlib-inline", + "version": "0.1.7", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "mkl", + "version": "2023.1.0", + "build": "h6b88ed4_46358" + }, + { + "name": "mkl-service", + "version": "2.4.0", + "build": "py311h2bbff1b_1" + }, + { + "name": "mkl_fft", + "version": "1.3.8", + "build": "py311h2bbff1b_0" + }, + { + "name": "mkl_random", + "version": "1.2.4", + "build": "py311h59b6b97_0" + }, + { + "name": "more-itertools", + "version": "10.2.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "multidict", + "version": "6.0.5", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "natsort", + "version": "8.4.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "nodeenv", + "version": "1.8.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "numba", + "version": "0.59.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "numcodecs", + "version": "0.12.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "numpy", + "version": "1.26.4", + "build": "py311hdab7c0b_0" + }, + { + "name": "numpy-base", + "version": "1.26.4", + "build": "py311hd01c5d8_0" + }, + { + "name": "nwb-benchmarks", + "version": "0.1.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "nwbinspector", + "version": "0.4.35", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "openssl", + "version": "3.3.0", + "build": "hcfcfb64_0", + "channel": "conda-forge" + }, + { + "name": "packaging", + "version": "24.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pandas", + "version": "2.2.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "parso", + "version": "0.8.4", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pip", + "version": "24.0", + "build": "py311haa95532_0" + }, + { + "name": "platformdirs", + "version": "4.2.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pre-commit", + "version": "3.7.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "prompt-toolkit", + "version": "3.0.43", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "psutil", + "version": "5.9.8", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pure-eval", + "version": "0.2.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pycryptodomex", + "version": "3.20.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pydantic", + "version": "2.7.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pydantic-core", + "version": "2.18.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pygments", + "version": "2.18.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pympler", + "version": "1.0.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pynwb", + "version": "2.7.1.dev3+g9f92f234", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pyout", + "version": "0.7.3", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pyshark", + "version": "0.6", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "python", + "version": "3.11.7", + "build": "he1021f5_0" + }, + { + "name": "python-dateutil", + "version": "2.9.0.post0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "python_abi", + "version": "3.11", + "build": "2_cp311", + "channel": "conda-forge" + }, + { + "name": "pytz", + "version": "2024.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pywin32-ctypes", + "version": "0.2.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "pyyaml", + "version": "6.0.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "referencing", + "version": "0.35.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "remfile", + "version": "0.1.11", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "requests", + "version": "2.31.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "rfc3339-validator", + "version": "0.1.4", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "rfc3987", + "version": "1.3.8", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "rpds-py", + "version": "0.18.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "ruamel-yaml", + "version": "0.18.6", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "ruamel-yaml-clib", + "version": "0.2.8", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "s3fs", + "version": "2024.5.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "scipy", + "version": "1.13.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "semantic-version", + "version": "2.10.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "setuptools", + "version": "69.5.1", + "build": "py311haa95532_0" + }, + { + "name": "six", + "version": "1.16.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "sqlite", + "version": "3.45.3", + "build": "h2bbff1b_0" + }, + { + "name": "stack-data", + "version": "0.6.3", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "tabulate", + "version": "0.9.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "tbb", + "version": "2021.8.0", + "build": "h59b6b97_0" + }, + { + "name": "tenacity", + "version": "8.3.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "termcolor", + "version": "2.4.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "threadpoolctl", + "version": "3.5.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "tk", + "version": "8.6.14", + "build": "h0416ee5_0" + }, + { + "name": "tqdm", + "version": "4.66.4", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "traitlets", + "version": "5.14.3", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "types-python-dateutil", + "version": "2.9.0.20240316", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "typing-extensions", + "version": "4.11.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "tzdata", + "version": "2024.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "ucrt", + "version": "10.0.20348.0", + "build": "haa95532_0" + }, + { + "name": "uri-template", + "version": "1.3.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "urllib3", + "version": "2.2.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "vc", + "version": "14.2", + "build": "h2eaa2aa_1" + }, + { + "name": "vc14_runtime", + "version": "14.38.33130", + "build": "h82b7239_18", + "channel": "conda-forge" + }, + { + "name": "virtualenv", + "version": "20.26.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "vs2015_runtime", + "version": "14.38.33130", + "build": "hcb4865c_18", + "channel": "conda-forge" + }, + { + "name": "wcwidth", + "version": "0.2.13", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "webcolors", + "version": "1.13", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "wheel", + "version": "0.43.0", + "build": "py311haa95532_0" + }, + { + "name": "wrapt", + "version": "1.16.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "xz", + "version": "5.4.6", + "build": "h8cc25b3_1" + }, + { + "name": "yarl", + "version": "1.9.4", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "zarr", + "version": "2.18.1", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "zarr-checksum", + "version": "0.4.0", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "zipp", + "version": "3.18.2", + "build": "pypi_0", + "channel": "pypi" + }, + { + "name": "zlib", + "version": "1.2.13", + "build": "hcfcfb64_5", + "channel": "conda-forge" + } + ] +} diff --git a/results/results_timestamp-2024-05-18-12-17-56_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json b/results/results_timestamp-2024-05-18-12-17-56_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json new file mode 100644 index 0000000..2992cfb --- /dev/null +++ b/results/results_timestamp-2024-05-18-12-17-56_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json @@ -0,0 +1,319 @@ +{ + "version": 2, + "timestamp": "2024-05-18-12-17-56", + "commit_hash": "53c006cc437ff9a560ffd83460ba75e421b2b03a", + "environment_hash": "91bf3abc58d3f9487dc3b25977d808fc1536e53f", + "machine_hash": "Ackermann", + "results": { + "time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_fsspec_no_cache": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.16437910008244216, + 0.16532570007257164, + 0.15922449994832277 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 0.32663320004940033, + 0.27816640003584325, + 0.24348079995252192 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.138875599950552, + 0.14935910003259778, + 0.15831620013341308 + ] + }, + "time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_fsspec_with_cache": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.15528129995800555, + 0.14582149987109005, + 0.14193509984761477 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 5.405785900074989, + 5.445226199924946, + 5.416317899944261 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.14332780009135604, + 0.15223159990273416, + 0.12911950005218387 + ] + }, + "time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_remfile": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.620539200026542, + 0.621054100105539, + 0.6188483000732958 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 0.6415840999688953, + 0.6552140999119729, + 0.6222103000618517 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.6231863000430167, + 0.6004282000940293, + 0.6005689001176506 + ] + }, + "time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_remfile_with_cache": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.6139211999252439, + 0.5944676999934018, + 0.5726550999097526 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 0.6569711999036372, + 0.6447171999607235, + 0.6402148001361638 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.6251256000250578, + 0.5910497999284416, + 0.5920192999765277 + ] + }, + "time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_ros3": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.1567285000346601, + 0.15413449984043837, + 0.1545219998806715 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 0.35575649980455637, + 0.3241110001690686, + 0.3663294001016766 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.12992109986953437, + 0.13395489985123277, + 0.12616059998981655 + ] + }, + "time_remote_file_reading.DirectZarrFileReadBenchmark.time_read_zarr_force_no_consolidated": { + "(\"'s3://aind-open-data/ecephys_625749_2022-08-03_15-15-06_nwb_2023-05-16_16-34-55/ecephys_625749_2022-08-03_15-15-06_nwb/ecephys_625749_2022-08-03_15-15-06_experiment1_recording1.nwb.zarr/'\",)": [ + 0.7102840999141335, + 0.6801524998154491, + 0.6849519999232143 + ] + }, + "time_remote_file_reading.LindiFileReadLocalReferenceFileSystemBenchmark.time_read_lindi_jsonrfs": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.0005994999972993837, + 0.0006168235285098062, + 0.000601476469241521 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 0.0015261624939739704, + 0.00142347501241602, + 0.0013838250015396625 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.0005939549999311566, + 0.0005728050018660724, + 0.0005473949946463108 + ] + }, + "time_remote_file_reading.LindiFileReadLocalReferenceFileSystemBenchmark.time_read_lindi_nwbfile": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.034188499907031655, + 0.03508759988471866, + 0.03454169980250299 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 0.026410300051793456, + 0.025371199939399958, + 0.025926699861884117 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.016336999833583832, + 0.015970399836078286, + 0.015704500023275614 + ] + }, + "time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_fsspec_no_cache": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.19744439981877804, + 0.18928559985943139, + 0.20990779995918274 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 1.2439464998897165, + 1.363062100019306, + 1.3168826000764966 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.1632117999251932, + 0.15555669995956123, + 0.15089479996822774 + ] + }, + "time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_fsspec_with_cache": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.19544989988207817, + 0.168602499878034, + 0.19603220000863075 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 5.425334399798885, + 7.25674459990114, + 9.065299100009724 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.1700746000278741, + 0.159640499856323, + 0.15025780000723898 + ] + }, + "time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_remfile": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.7016509000677615, + 0.6840565998572856, + 0.6544784000143409 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 0.6825810999143869, + 0.6715160000603646, + 0.699720700038597 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.6813602999318391, + 0.6567565998993814, + 0.6638064000289887 + ] + }, + "time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_remfile_with_cache": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.668400099966675, + 0.6649241000413895, + 0.6767508999910206 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 0.7051319000311196, + 0.7142988999839872, + 0.7189285000786185 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.6318534999154508, + 0.6542047001421452, + 0.6309767998754978 + ] + }, + "time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_ros3": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.3454910998698324, + 0.38195880013518035, + 0.34967439994215965 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 2.6634392999112606, + 0.8064345999155194, + 0.8204387999139726 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.3506010000128299, + 0.29899280006065965, + 0.29477320006117225 + ] + }, + "time_remote_file_reading.NWBLindiFileCreateLocalReferenceFileSystemBenchmark.time_create_lindi_referernce_file_system": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.6666148998774588, + 0.6910041000228375, + 0.6475039999932051 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 1.8787150999996811, + 1.6234514000825584, + 1.617799799889326 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.6613920999225229, + 0.6835459000431001, + 0.6500396998599172 + ] + }, + "time_remote_file_reading.NWBLindiFileCreateLocalReferenceFileSystemBenchmark.time_create_lindi_referernce_file_system_and_read_jsonrfs": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.6585524000693113, + 0.6427635999862105, + 0.6552790000569075 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 1.528076299931854, + 1.6133820000104606, + 1.5888395002111793 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.652005200041458, + 0.6637958998326212, + 0.6639284000266343 + ] + }, + "time_remote_file_reading.NWBLindiFileCreateLocalReferenceFileSystemBenchmark.time_create_lindi_referernce_file_system_and_read_nwbfile": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)": [ + 0.6909090001136065, + 0.6837116000242531, + 0.685534899821505 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)": [ + 1.6079902001656592, + 1.6549257999286056, + 1.5748821999877691 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)": [ + 0.6597631999757141, + 0.6545092000160366, + 0.6495263001415879 + ] + }, + "time_remote_file_reading.NWBLindiFileReadRemoteReferenceFileSystemBenchmark.time_read_lindi_jsonrfs": { + "(\"'https://dandi-api-staging-dandisets.s3.amazonaws.com/blobs/914/6aa/9146aa46-9c01-45be-9d2a-693e6a7bb778'\",)": [ + 0.3281646999530494, + 0.31189209991134703, + 0.3120460999198258 + ], + "(\"'https://dandi-api-staging-dandisets.s3.amazonaws.com/blobs/4ea/7d6/4ea7d66c-82f0-4d15-b9a5-e181fb1d7dd8'\",)": [ + 3.3408337999135256, + 3.2233618998434395, + 3.71747100003995 + ], + "(\"'https://dandi-api-staging-dandisets.s3.amazonaws.com/blobs/956/9bc/9569bc8a-bbe7-4e14-b8ea-d1b49f38f833'\",)": [ + 0.41753670014441013, + 0.4603041000664234, + 0.41413390007801354 + ] + }, + "time_remote_file_reading.NWBLindiFileReadRemoteReferenceFileSystemBenchmark.time_read_lindi_nwbfile": { + "(\"'https://dandi-api-staging-dandisets.s3.amazonaws.com/blobs/914/6aa/9146aa46-9c01-45be-9d2a-693e6a7bb778'\",)": [ + 0.3678304001223296, + 0.34239770006388426, + 0.3440149000380188 + ], + "(\"'https://dandi-api-staging-dandisets.s3.amazonaws.com/blobs/4ea/7d6/4ea7d66c-82f0-4d15-b9a5-e181fb1d7dd8'\",)": [ + 10.210882100043818, + 10.317596199922264, + 10.53281269990839 + ], + "(\"'https://dandi-api-staging-dandisets.s3.amazonaws.com/blobs/956/9bc/9569bc8a-bbe7-4e14-b8ea-d1b49f38f833'\",)": [ + 6.041566799860448, + 5.912658600136638, + 5.738921499811113 + ] + }, + "time_remote_file_reading.NWBZarrFileReadBenchmark.time_read_zarr_nwbfile": { + "(\"'s3://aind-open-data/ecephys_625749_2022-08-03_15-15-06_nwb_2023-05-16_16-34-55/ecephys_625749_2022-08-03_15-15-06_nwb/ecephys_625749_2022-08-03_15-15-06_experiment1_recording1.nwb.zarr/'\",)": [ + 77.85015589999966, + 77.23121759993955, + 77.31826049997471 + ] + }, + "time_remote_file_reading.NWBZarrFileReadBenchmark.time_read_zarr_nwbfile_force_no_consolidated": { + "(\"'s3://aind-open-data/ecephys_625749_2022-08-03_15-15-06_nwb_2023-05-16_16-34-55/ecephys_625749_2022-08-03_15-15-06_nwb/ecephys_625749_2022-08-03_15-15-06_experiment1_recording1.nwb.zarr/'\",)": [ + 76.83005929994397, + 76.0116564000491, + 76.39240320003591 + ] + } + } +} From 28e870e6832f11288c2211c56cfc7b3a3a071b5a Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sat, 18 May 2024 16:00:41 -0400 Subject: [PATCH 14/20] limit automatic cartesian product --- .../benchmarks/time_remote_slicing.py | 22 +- src/nwb_benchmarks/core/_base_benchmark.py | 45 +- .../scripts/plot_single_result_example.ipynb | 782 +----------------- 3 files changed, 85 insertions(+), 764 deletions(-) diff --git a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py index 7d6e55f..15b44b5 100644 --- a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py +++ b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py @@ -17,14 +17,30 @@ ) parameter_cases = dict( - IBLTestCase1=dict( + EcephysTestCase=dict( s3_url=get_s3_url( dandiset_id="000717", dandi_path="sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.nwb", ), object_name="ElectricalSeriesAp", - slice_range=(slice(0, 30_000), slice(0, 384)), # ~23 MB - ) + slice_range=(slice(0, 30_000), slice(0, 384)), + ), + OphysTestCase=dict( + s3_url=get_s3_url( + dandiset_id="000717", + dandi_path="sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.nwb", + ), + object_name="TwoPhotonSeries", + slice_range=(slice(0, 3), slice(0, 796), slice(0, 512)), + ), + # IcephysTestCase=dict( + # s3_url=get_s3_url( + # dandiset_id="000717", + # dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.nwb", + # ), + # object_name="data_00002_AD0", + # slice_range=(slice(0, 30_000),), + # ), ) zarr_parameter_cases = dict( diff --git a/src/nwb_benchmarks/core/_base_benchmark.py b/src/nwb_benchmarks/core/_base_benchmark.py index f366fbd..a21966f 100644 --- a/src/nwb_benchmarks/core/_base_benchmark.py +++ b/src/nwb_benchmarks/core/_base_benchmark.py @@ -1,4 +1,7 @@ -from typing import Any, Dict, Union +import itertools +from typing import Any, Dict, Self, Union + +import asv_runner class BaseBenchmark: @@ -27,19 +30,43 @@ class BaseBenchmark: parameter_cases: Union[Dict[str, Dict[str, Any]], None] = None - def __init__(self): + def __new__(cls, *args, **kwargs) -> Self: + instance = super().__new__(cls) + # Unpack parameter cases dictionary into ASV expected form - if self.parameter_cases is not None: - self.param_names = list(next(iter(self.parameter_cases.values())).keys()) - self.params = ( + if cls.parameter_cases is not None: + cls.param_names = list(next(iter(cls.parameter_cases.values())).keys()) + cls.params = ( [ - [parameter_case[param_name] for parameter_case in self.parameter_cases.values()] - for param_name in self.param_names + [parameter_case[param_name] for parameter_case in cls.parameter_cases.values()] + for param_name in cls.param_names ] - if len(self.param_names) > 1 + if len(cls.param_names) > 1 else [ parameter - for parameter_case in self.parameter_cases.values() + for parameter_case in cls.parameter_cases.values() for parameter in parameter_case.values() ] ) + + # ASV automatically forms a cartesian product over all params + # But we want our `parameter_names` usage to be flat in order to be more explicit + # So use the skip decorator to exclude the 'off-diagonal' parts of a square product + # These will still show up in the console display table, but will have n/a as display value + # And values of samples in intermediate results will be saved to JSON as `null` + cartesian_params = itertools.product(*cls.params) + desired_params = [ + tuple(parameter_case[parameter_name] for parameter_name in cls.param_names) + for parameter_case in cls.parameter_cases.values() + ] + non_cartesian_exclusion = [ + cartesian_param for cartesian_param in cartesian_params if cartesian_param not in desired_params + ] + + for method_name, method in vars(cls).items(): + if any(method_name.startswith(prefix) for prefix in ["time_", "track_"]): # Add more when needed + setattr( + cls, method_name, asv_runner.benchmarks.mark.skip_for_params(non_cartesian_exclusion)(method) + ) + + return instance diff --git a/src/nwb_benchmarks/scripts/plot_single_result_example.ipynb b/src/nwb_benchmarks/scripts/plot_single_result_example.ipynb index 8dbf693..ec97379 100644 --- a/src/nwb_benchmarks/scripts/plot_single_result_example.ipynb +++ b/src/nwb_benchmarks/scripts/plot_single_result_example.ipynb @@ -5,7 +5,6 @@ "execution_count": 1, "id": "2fcde6ce-008a-41c6-994e-66b59e7c4778", "metadata": {}, - "outputs": [], "source": [ "import json\n", "import os\n", @@ -19,7 +18,8 @@ " result_dir, \n", " \"results_timestamp-2024-04-24-13-52-49_machine-f0-2f-4b-15-53-89.dhcp.lbnl.us_environment-4a85d57591fe6e0e05654aa72b456df5dab8ecd5.json\"\n", ")" - ] + ], + "outputs": [] }, { "cell_type": "markdown", @@ -34,7 +34,6 @@ "execution_count": 2, "id": "bab8fcbf-3f47-4328-a6cd-46f6fa9870a3", "metadata": {}, - "outputs": [], "source": [ "def parse_results(result_filename: str):\n", " \"\"\"\n", @@ -82,7 +81,8 @@ " single_test_case = single_test_case.dropna()\n", " single_test_case_df = pd.DataFrame.from_records(single_test_case, index=single_test_case.index)\n", " return single_test_case_df" - ] + ], + "outputs": [] }, { "cell_type": "markdown", @@ -97,12 +97,12 @@ "execution_count": 3, "id": "7766d56a-0188-40de-bd52-16f2af1add4c", "metadata": {}, - "outputs": [], "source": [ "raw_results, raw_machine_info = parse_results(result_filename=result_filename)\n", "network_tracking_results = get_network_tracking_tests(raw_results=raw_results)\n", "time_remote_results = get_time_remote_tests(raw_results=raw_results)" - ] + ], + "outputs": [] }, { "cell_type": "markdown", @@ -117,442 +117,20 @@ "execution_count": 4, "id": "223cfafa-68e6-4e33-80d0-24f1c2968101", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
network_tracking_remote_file_reading.FsspecNoCacheDirectFileReadBenchmark.track_network_activity_during_readnetwork_tracking_remote_file_reading.FsspecNoCacheNWBFileReadBenchmark.track_network_activity_during_readnetwork_tracking_remote_file_reading.FsspecWithCacheDirectFileReadBenchmark.track_network_activity_during_readnetwork_tracking_remote_file_reading.FsspecWithCacheNWBFileReadBenchmark.track_network_activity_during_readnetwork_tracking_remote_file_reading.RemfileDirectFileReadBenchmark.track_network_activity_during_readnetwork_tracking_remote_file_reading.RemfileDirectFileReadBenchmarkWithCache.track_network_activity_during_readnetwork_tracking_remote_file_reading.RemfileNWBFileReadBenchmark.track_network_activity_during_readnetwork_tracking_remote_file_reading.RemfileNWBFileReadBenchmarkWithCache.track_network_activity_during_readnetwork_tracking_remote_file_reading.Ros3DirectFileReadBenchmark.track_network_activity_during_readnetwork_tracking_remote_file_reading.Ros3NWBFileReadBenchmark.track_network_activity_during_readnetwork_tracking_remote_slicing.FsspecNoCacheContinuousSliceBenchmark.track_network_activity_during_slicenetwork_tracking_remote_slicing.FsspecWithCacheContinuousSliceBenchmark.track_network_activity_during_slicenetwork_tracking_remote_slicing.RemfileContinuousSliceBenchmark.track_network_activity_during_slicenetwork_tracking_remote_slicing.RemfileContinuousSliceBenchmarkWithCache.track_network_activity_during_slicenetwork_tracking_remote_slicing.Ros3ContinuousSliceBenchmark.track_network_activity_during_slice
(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",){'amount_downloaded_in_bytes': 0, 'amount_uplo...{'amount_downloaded_in_bytes': 214062, 'amount...{'amount_downloaded_in_bytes': 213542, 'amount...{'amount_downloaded_in_bytes': 213442, 'amount...{'amount_downloaded_in_bytes': 147776, 'amount...{'amount_downloaded_in_bytes': 166661, 'amount...{'amount_downloaded_in_bytes': 253945, 'amount...{'amount_downloaded_in_bytes': 272426, 'amount...{'amount_downloaded_in_bytes': 0, 'amount_uplo...{'amount_downloaded_in_bytes': 479447, 'amount...NaNNaNNaNNaNNaN
(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",){'amount_downloaded_in_bytes': 5646446, 'amoun...{'amount_downloaded_in_bytes': 45000516, 'amou...{'amount_downloaded_in_bytes': 11249268, 'amou...{'amount_downloaded_in_bytes': 10840104, 'amou...{'amount_downloaded_in_bytes': 268146, 'amount...{'amount_downloaded_in_bytes': 302804, 'amount...{'amount_downloaded_in_bytes': 350038, 'amount...{'amount_downloaded_in_bytes': 351753, 'amount...{'amount_downloaded_in_bytes': 0, 'amount_uplo...{'amount_downloaded_in_bytes': 35110831, 'amou...NaNNaNNaNNaNNaN
(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",){'amount_downloaded_in_bytes': 193059, 'amount...{'amount_downloaded_in_bytes': 192520, 'amount...{'amount_downloaded_in_bytes': 192596, 'amount...{'amount_downloaded_in_bytes': 192520, 'amount...{'amount_downloaded_in_bytes': 157307, 'amount...{'amount_downloaded_in_bytes': 154022, 'amount...{'amount_downloaded_in_bytes': 227430, 'amount...{'amount_downloaded_in_bytes': 265691, 'amount...{'amount_downloaded_in_bytes': 0, 'amount_uplo...{'amount_downloaded_in_bytes': 387270, 'amount...NaNNaNNaNNaNNaN
(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN{'amount_downloaded_in_bytes': 43696526, 'amou...{'amount_downloaded_in_bytes': 27307869, 'amou...{'amount_downloaded_in_bytes': 26674022, 'amou...{'amount_downloaded_in_bytes': 26660508, 'amou...{'amount_downloaded_in_bytes': 21835885, 'amou...
\n", - "
" - ], - "text/plain": [ - " network_tracking_remote_file_reading.FsspecNoCacheDirectFileReadBenchmark.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 0, 'amount_uplo... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 5646446, 'amoun... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 193059, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.FsspecNoCacheNWBFileReadBenchmark.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 214062, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 45000516, 'amou... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 192520, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.FsspecWithCacheDirectFileReadBenchmark.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 213542, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 11249268, 'amou... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 192596, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.FsspecWithCacheNWBFileReadBenchmark.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 213442, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 10840104, 'amou... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 192520, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.RemfileDirectFileReadBenchmark.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 147776, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 268146, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 157307, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.RemfileDirectFileReadBenchmarkWithCache.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 166661, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 302804, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 154022, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.RemfileNWBFileReadBenchmark.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 253945, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 350038, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 227430, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.RemfileNWBFileReadBenchmarkWithCache.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 272426, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 351753, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 265691, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.Ros3DirectFileReadBenchmark.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 0, 'amount_uplo... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 0, 'amount_uplo... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 0, 'amount_uplo... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_file_reading.Ros3NWBFileReadBenchmark.track_network_activity_during_read \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 479447, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 35110831, 'amou... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... {'amount_downloaded_in_bytes': 387270, 'amount... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " network_tracking_remote_slicing.FsspecNoCacheContinuousSliceBenchmark.track_network_activity_during_slice \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 43696526, 'amou... \n", - "\n", - " network_tracking_remote_slicing.FsspecWithCacheContinuousSliceBenchmark.track_network_activity_during_slice \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 27307869, 'amou... \n", - "\n", - " network_tracking_remote_slicing.RemfileContinuousSliceBenchmark.track_network_activity_during_slice \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 26674022, 'amou... \n", - "\n", - " network_tracking_remote_slicing.RemfileContinuousSliceBenchmarkWithCache.track_network_activity_during_slice \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 26660508, 'amou... \n", - "\n", - " network_tracking_remote_slicing.Ros3ContinuousSliceBenchmark.track_network_activity_during_slice \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... {'amount_downloaded_in_bytes': 21835885, 'amou... " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "display(network_tracking_results)" - ] + ], + "outputs": [] }, { "cell_type": "code", "execution_count": 5, "id": "0227e2e8-0732-4184-9c7c-29bebc3a3672", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_fsspec_no_cachetime_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_fsspec_with_cachetime_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_remfiletime_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_remfile_with_cachetime_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_ros3time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_fsspec_no_cachetime_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_fsspec_with_cachetime_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_remfiletime_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_remfile_with_cachetime_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_ros3time_remote_slicing.FsspecNoCacheContinuousSliceBenchmark.time_slicetime_remote_slicing.FsspecWithCacheContinuousSliceBenchmark.time_slicetime_remote_slicing.RemfileContinuousSliceBenchmark.time_slicetime_remote_slicing.RemfileContinuousSliceBenchmarkWithCache.time_slicetime_remote_slicing.Ros3ContinuousSliceBenchmark.time_slice
(\"'https://dandiarchive.s3.amazonaws.com/blobs/dc3/028/dc302863-52b3-4675-9b5e-cf5f8c7636a7'\",)[0.5035112909972668, 0.5001549999578856, 0.506...[0.5305881249951199, 0.5392212079605088, 0.538...[0.6369514169637114, 0.6295166250201873, 0.622...[0.6398781670141034, 0.6483911670511588, 0.633...[0.5034994999878109, 0.49389495799550787, 0.50...[0.5666222499567084, 0.5676359580247663, 0.654...[0.595303000009153, 0.5622682920075022, 0.5947...[1.043911290995311, 1.0107967919902876, 1.0635...[0.7882591670495458, 0.8070574160083197, 0.790...[2.3300142499501817, 1.0253219999722205, 1.083...NaNNaNNaNNaNNaN
(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)[3.334527375001926, 2.381788416998461, 2.11166...[2.8482615829561837, 4.500675209041219, 1.5599...[0.7322884160093963, 0.793164708011318, 0.7359...[0.7473873340059072, 0.8004671670496464, 0.757...[3.225847583031282, 2.465878375049215, 3.08408...[12.189672209031414, 10.679295875015669, 12.98...[5.389149124966934, 3.3350068750442006, 2.4899...[1.1496044999803416, 1.1405767919495702, 1.154...[0.8914747920352966, 0.9610544589813799, 0.891...[11.829411499958951, 8.687583249993622, 12.437...NaNNaNNaNNaNNaN
(\"'https://dandiarchive.s3.amazonaws.com/ros3test.nwb'\",)[0.4493255830020644, 0.4461168340058066, 0.446...[0.5150681670056656, 0.47260254103457555, 0.48...[0.66970724996645, 0.6651473750243895, 0.62691...[0.6540609580115415, 0.6300513750175014, 0.653...[0.4339276250102557, 0.4359898750553839, 0.439...[0.4864183749887161, 0.4805889169801958, 0.492...[0.7969977920292877, 0.7467974579776637, 0.606...[0.7680339999496937, 0.7613873329828493, 0.762...[0.7747533340007067, 0.7741332920268178, 0.765...[1.0744448750047013, 0.9215772920288146, 0.924...NaNNaNNaNNaNNaN
(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN[11.009881000034511, 14.997986041998956, 9.719...[5.833667333994526, 7.168427375028841, 7.41557...[7.905155165994074, 6.952957374975085, 8.38063...[8.480555457994342, 5.427363708033226, 5.84784...[0.002822709036991, 0.0019847499788738787, 0.0...
\n", - "
" - ], - "text/plain": [ - " time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_fsspec_no_cache \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.5035112909972668, 0.5001549999578856, 0.506... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [3.334527375001926, 2.381788416998461, 2.11166... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.4493255830020644, 0.4461168340058066, 0.446... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_fsspec_with_cache \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.5305881249951199, 0.5392212079605088, 0.538... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [2.8482615829561837, 4.500675209041219, 1.5599... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.5150681670056656, 0.47260254103457555, 0.48... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_remfile \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.6369514169637114, 0.6295166250201873, 0.622... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.7322884160093963, 0.793164708011318, 0.7359... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.66970724996645, 0.6651473750243895, 0.62691... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_remfile_with_cache \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.6398781670141034, 0.6483911670511588, 0.633... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.7473873340059072, 0.8004671670496464, 0.757... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.6540609580115415, 0.6300513750175014, 0.653... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.DirectFileReadBenchmark.time_read_hdf5_ros3 \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.5034994999878109, 0.49389495799550787, 0.50... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [3.225847583031282, 2.465878375049215, 3.08408... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.4339276250102557, 0.4359898750553839, 0.439... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_fsspec_no_cache \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.5666222499567084, 0.5676359580247663, 0.654... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [12.189672209031414, 10.679295875015669, 12.98... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.4864183749887161, 0.4805889169801958, 0.492... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_fsspec_with_cache \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.595303000009153, 0.5622682920075022, 0.5947... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [5.389149124966934, 3.3350068750442006, 2.4899... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.7969977920292877, 0.7467974579776637, 0.606... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_remfile \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [1.043911290995311, 1.0107967919902876, 1.0635... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [1.1496044999803416, 1.1405767919495702, 1.154... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.7680339999496937, 0.7613873329828493, 0.762... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_remfile_with_cache \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.7882591670495458, 0.8070574160083197, 0.790... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.8914747920352966, 0.9610544589813799, 0.891... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [0.7747533340007067, 0.7741332920268178, 0.765... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_file_reading.NWBFileReadBenchmark.time_read_hdf5_nwbfile_ros3 \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [2.3300142499501817, 1.0253219999722205, 1.083... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [11.829411499958951, 8.687583249993622, 12.437... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... [1.0744448750047013, 0.9215772920288146, 0.924... \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "\n", - " time_remote_slicing.FsspecNoCacheContinuousSliceBenchmark.time_slice \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [11.009881000034511, 14.997986041998956, 9.719... \n", - "\n", - " time_remote_slicing.FsspecWithCacheContinuousSliceBenchmark.time_slice \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [5.833667333994526, 7.168427375028841, 7.41557... \n", - "\n", - " time_remote_slicing.RemfileContinuousSliceBenchmark.time_slice \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [7.905155165994074, 6.952957374975085, 8.38063... \n", - "\n", - " time_remote_slicing.RemfileContinuousSliceBenchmarkWithCache.time_slice \\\n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [8.480555457994342, 5.427363708033226, 5.84784... \n", - "\n", - " time_remote_slicing.Ros3ContinuousSliceBenchmark.time_slice \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/ros3te... NaN \n", - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/... [0.002822709036991, 0.0019847499788738787, 0.0... " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "display(time_remote_results)" - ] + ], + "outputs": [] }, { "cell_type": "markdown", @@ -567,7 +145,6 @@ "execution_count": 6, "id": "b8c8c9e9-6f6d-498f-ac2a-443b9ea09c9d", "metadata": {}, - "outputs": [], "source": [ "rowindex= 1\n", "single_test_case = get_networktest_row_as_dataframe(\n", @@ -575,332 +152,44 @@ " index=rowindex, \n", " drop_missing=True)\n", "test_case_params = network_tracking_results.index[rowindex]" - ] + ], + "outputs": [] }, { "cell_type": "code", "execution_count": 7, "id": "245d6fd3-7bec-4937-a8dc-23e70d574e4a", "metadata": {}, - "outputs": [], "source": [ "# Simplify the index by removing redundant text\n", "single_test_case.index = [ v.replace(\"network_tracking_remote_file_reading.\", \"\").replace(\".track_network_activity_during_read\", \"\")\n", " for v in single_test_case.index ]" - ] + ], + "outputs": [] }, { "cell_type": "code", "execution_count": 8, "id": "5179bb42-ca43-433c-bb6b-32f7f8c33f89", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\",)\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
amount_downloaded_in_bytesamount_uploaded_in_bytestotal_transfer_in_bytesamount_downloaded_in_number_of_packetsamount_uploaded_in_number_of_packetstotal_transfer_in_number_of_packetstotal_traffic_in_number_of_web_packetstotal_transfer_time_in_secondsnetwork_total_time_in_seconds
FsspecNoCacheDirectFileReadBenchmark5646446279375674383393250344355033.5246653.682455
FsspecNoCacheNWBFileReadBenchmark450005162238074522432331336396035296396015.59013815.690805
FsspecWithCacheDirectFileReadBenchmark1124926820189011451158789028731076328732.8219372.901334
FsspecWithCacheNWBFileReadBenchmark108401041069641094706875471894944118943.0144843.154232
RemfileDirectFileReadBenchmark268146716327530920896304960.7356040.755981
RemfileDirectFileReadBenchmarkWithCache30280479733107772331113441110.7049660.716397
RemfileNWBFileReadBenchmark350038697435701226797364970.7516390.912818
RemfileNWBFileReadBenchmarkWithCache35175392193609722711294001290.8026340.869307
Ros3DirectFileReadBenchmark00000000.0000005.677761
Ros3NWBFileReadBenchmark351108315749543568578524579919633775919618.49976018.582128
\n", - "
" - ], - "text/plain": [ - " amount_downloaded_in_bytes \\\n", - "FsspecNoCacheDirectFileReadBenchmark 5646446 \n", - "FsspecNoCacheNWBFileReadBenchmark 45000516 \n", - "FsspecWithCacheDirectFileReadBenchmark 11249268 \n", - "FsspecWithCacheNWBFileReadBenchmark 10840104 \n", - "RemfileDirectFileReadBenchmark 268146 \n", - "RemfileDirectFileReadBenchmarkWithCache 302804 \n", - "RemfileNWBFileReadBenchmark 350038 \n", - "RemfileNWBFileReadBenchmarkWithCache 351753 \n", - "Ros3DirectFileReadBenchmark 0 \n", - "Ros3NWBFileReadBenchmark 35110831 \n", - "\n", - " amount_uploaded_in_bytes \\\n", - "FsspecNoCacheDirectFileReadBenchmark 27937 \n", - "FsspecNoCacheNWBFileReadBenchmark 223807 \n", - "FsspecWithCacheDirectFileReadBenchmark 201890 \n", - "FsspecWithCacheNWBFileReadBenchmark 106964 \n", - "RemfileDirectFileReadBenchmark 7163 \n", - "RemfileDirectFileReadBenchmarkWithCache 7973 \n", - "RemfileNWBFileReadBenchmark 6974 \n", - "RemfileNWBFileReadBenchmarkWithCache 9219 \n", - "Ros3DirectFileReadBenchmark 0 \n", - "Ros3NWBFileReadBenchmark 574954 \n", - "\n", - " total_transfer_in_bytes \\\n", - "FsspecNoCacheDirectFileReadBenchmark 5674383 \n", - "FsspecNoCacheNWBFileReadBenchmark 45224323 \n", - "FsspecWithCacheDirectFileReadBenchmark 11451158 \n", - "FsspecWithCacheNWBFileReadBenchmark 10947068 \n", - "RemfileDirectFileReadBenchmark 275309 \n", - "RemfileDirectFileReadBenchmarkWithCache 310777 \n", - "RemfileNWBFileReadBenchmark 357012 \n", - "RemfileNWBFileReadBenchmarkWithCache 360972 \n", - "Ros3DirectFileReadBenchmark 0 \n", - "Ros3NWBFileReadBenchmark 35685785 \n", - "\n", - " amount_downloaded_in_number_of_packets \\\n", - "FsspecNoCacheDirectFileReadBenchmark 3932 \n", - "FsspecNoCacheNWBFileReadBenchmark 31336 \n", - "FsspecWithCacheDirectFileReadBenchmark 7890 \n", - "FsspecWithCacheNWBFileReadBenchmark 7547 \n", - "RemfileDirectFileReadBenchmark 208 \n", - "RemfileDirectFileReadBenchmarkWithCache 233 \n", - "RemfileNWBFileReadBenchmark 267 \n", - "RemfileNWBFileReadBenchmarkWithCache 271 \n", - "Ros3DirectFileReadBenchmark 0 \n", - "Ros3NWBFileReadBenchmark 24579 \n", - "\n", - " amount_uploaded_in_number_of_packets \\\n", - "FsspecNoCacheDirectFileReadBenchmark 503 \n", - "FsspecNoCacheNWBFileReadBenchmark 3960 \n", - "FsspecWithCacheDirectFileReadBenchmark 2873 \n", - "FsspecWithCacheNWBFileReadBenchmark 1894 \n", - "RemfileDirectFileReadBenchmark 96 \n", - "RemfileDirectFileReadBenchmarkWithCache 111 \n", - "RemfileNWBFileReadBenchmark 97 \n", - "RemfileNWBFileReadBenchmarkWithCache 129 \n", - "Ros3DirectFileReadBenchmark 0 \n", - "Ros3NWBFileReadBenchmark 9196 \n", - "\n", - " total_transfer_in_number_of_packets \\\n", - "FsspecNoCacheDirectFileReadBenchmark 4435 \n", - "FsspecNoCacheNWBFileReadBenchmark 35296 \n", - "FsspecWithCacheDirectFileReadBenchmark 10763 \n", - "FsspecWithCacheNWBFileReadBenchmark 9441 \n", - "RemfileDirectFileReadBenchmark 304 \n", - "RemfileDirectFileReadBenchmarkWithCache 344 \n", - "RemfileNWBFileReadBenchmark 364 \n", - "RemfileNWBFileReadBenchmarkWithCache 400 \n", - "Ros3DirectFileReadBenchmark 0 \n", - "Ros3NWBFileReadBenchmark 33775 \n", - "\n", - " total_traffic_in_number_of_web_packets \\\n", - "FsspecNoCacheDirectFileReadBenchmark 503 \n", - "FsspecNoCacheNWBFileReadBenchmark 3960 \n", - "FsspecWithCacheDirectFileReadBenchmark 2873 \n", - "FsspecWithCacheNWBFileReadBenchmark 1894 \n", - "RemfileDirectFileReadBenchmark 96 \n", - "RemfileDirectFileReadBenchmarkWithCache 111 \n", - "RemfileNWBFileReadBenchmark 97 \n", - "RemfileNWBFileReadBenchmarkWithCache 129 \n", - "Ros3DirectFileReadBenchmark 0 \n", - "Ros3NWBFileReadBenchmark 9196 \n", - "\n", - " total_transfer_time_in_seconds \\\n", - "FsspecNoCacheDirectFileReadBenchmark 3.524665 \n", - "FsspecNoCacheNWBFileReadBenchmark 15.590138 \n", - "FsspecWithCacheDirectFileReadBenchmark 2.821937 \n", - "FsspecWithCacheNWBFileReadBenchmark 3.014484 \n", - "RemfileDirectFileReadBenchmark 0.735604 \n", - "RemfileDirectFileReadBenchmarkWithCache 0.704966 \n", - "RemfileNWBFileReadBenchmark 0.751639 \n", - "RemfileNWBFileReadBenchmarkWithCache 0.802634 \n", - "Ros3DirectFileReadBenchmark 0.000000 \n", - "Ros3NWBFileReadBenchmark 18.499760 \n", - "\n", - " network_total_time_in_seconds \n", - "FsspecNoCacheDirectFileReadBenchmark 3.682455 \n", - "FsspecNoCacheNWBFileReadBenchmark 15.690805 \n", - "FsspecWithCacheDirectFileReadBenchmark 2.901334 \n", - "FsspecWithCacheNWBFileReadBenchmark 3.154232 \n", - "RemfileDirectFileReadBenchmark 0.755981 \n", - "RemfileDirectFileReadBenchmarkWithCache 0.716397 \n", - "RemfileNWBFileReadBenchmark 0.912818 \n", - "RemfileNWBFileReadBenchmarkWithCache 0.869307 \n", - "Ros3DirectFileReadBenchmark 5.677761 \n", - "Ros3NWBFileReadBenchmark 18.582128 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "print(test_case_params)\n", "display(single_test_case)" - ] + ], + "outputs": [] }, { "cell_type": "code", "execution_count": 9, "id": "b337518f-6611-4027-b51d-de24b078407d", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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hBisREREEmKwEhERSYjBSkREJCEGKxERkYQYrERERBJisBIREUmIwUpERCQhBisREZGEGKxEREQSYrASERFJiMFKREQkIa0O1oCAALRu3RomJiawtLTEoEGDcPXqVU2XRUREWkyrgzUiIgKTJk3C6dOnERYWhqdPn6JXr154+PChpksjIiItpafpAl6l0NBQtcchISGwtLREVFQUOnfurKGqiIhIm2l1sL4oMzMTAGBubv7SNjk5OcjJyREfZ2VlvfK6iIhIe2j1oeDnCYIAHx8fdOzYEc7Ozi9tFxAQAKVSKQ4qleo1VklERG+6ahOs3t7euHTpErZu3Vpiu7lz5yIzM1MckpOTX1OFRESkDarFoeDJkydj7969OH78OOzs7EpsK5fLIZfLX1NlRESkbbQ6WAVBwOTJk7F7926Eh4fDwcFB0yUREZGW0+pgnTRpEn7++Wf89ttvMDExQVpaGgBAqVRCoVBouDoiItJGWn2ONTg4GJmZmejatStsbGzEYfv27ZoujYiItJRW77EKgqDpEoiIqJrR6j1WIiKi143BSkREJCEGKxERkYQYrERERBJisBIREUmIwUpERCQhBisREZGEGKxEREQSYrASERFJiMFKREQkIQYrERGRhBisREREEmKwEhERSUirf92Gqr5mG5tJ2t/l0Zcl7Y+IqLwYrEQvIWXoM/CJqg8eCiYiIpIQg5WIiEhCDFYiIiIJMViJiIgkxGAlIiKSEIOViIhIQgxWIiIiCTFYiYiIJMRgJSIikhCDlYiISEIMViIiIgnxXsES4r1liYiIe6xEREQSYrASERFJiMFKREQkIQYrERGRhBisREREEmKwEhERSYjBSkREJCEGKxERkYSqRbB+9913cHBwgKGhIVxcXHDixAlNl0RERFpK64N1+/btmDZtGubNm4fo6Gh06tQJffr0QVJSkqZLIyIiLaT1wbp8+XJ4eXlhzJgxcHR0xMqVK6FSqRAcHKzp0oiISAtp9b2Cc3NzERUVhTlz5qiN79WrFyIjI4udJycnBzk5OeLjzMxMAEBWVlapy8t/nF+JatWVZXllJWVdAGurCCnrAoB2P7eTrK/TI09L1peUdQGsrSKkrKsqe92fHYXTBUEovTNBi92+fVsAIJw6dUpt/OLFi4VGjRoVO4+fn58AgAMHDhw4cCgyJCcnl5o9Wr3HWkgmk6k9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RESkIjZWIiIiFbGxEhERqYiNlYiISEVsrERERCpiYyUiIlIRGysREZGK2FiJiIhUxMZKRESkIjZWIiIiFbGxEhERqYh3t1ER74ZCRERcYyUiIlIRGysREZGK2FiJiIhUxMZKRESkIjZWIiIiFbGxEhERqYiNlYiISEVsrERERCoqFI3166+/hq+vL2xsbFCrVi0cOHBA60hERFRAFfjGumnTJgwfPhwTJkzA6dOn0bhxY7Rp0waRkZFaRyMiogKowDfWBQsWoF+/fvj444/h7++PRYsWwdvbG8uXL9c6GhERFUAF+lrBqampOHnyJMaNG2cw/K233kJoaKjR16SkpCAlJUV5Hh8fDwBISEh46fs9efr0NdIaysn75ZSauQBmyw01cwHA0j7vqTavoWv/p9q81MwFMFtuqJlLZqb+7cgYL4R4+cxEAXbr1i0BQBw6dMhg+IwZM0T58uWNvmby5MkCAB988MEHH3xkekRFRb209xToNdYMOp3O4LkQItOwDOPHj8eIESOU53q9Hvfv34erq2uWr8mphIQEeHt7IyoqCk5OTq81L7UxW+7Imk3WXACz5Zas2WTNBaibTQiBR48ewcvL66XTFujGWqxYMZibmyMmJsZgeGxsLDw8PIy+xtraGtbW1gbDXFxcVM3l5OQk3RcwA7PljqzZZM0FMFtuyZpN1lyAetmcnZ1zNF2BPnjJysoKtWrVwr59+wyG79u3Dw0bNtQoFRERFWQFeo0VAEaMGIGePXuidu3aaNCgAVauXInIyEgMHDhQ62hERFQAFfjG2q1bN9y7dw/Tpk1DdHQ0KleujF27dqF06dImz2JtbY3Jkydn2tQsA2bLHVmzyZoLYLbckjWbrLkA7bLphMjJscNERESUEwV6HysREZGpsbESERGpiI2ViIhIRWysREREKmJjJSIiUhEbKxERkYrYWImIiFTExkpERKQiNlYiIiIVsbESERGpiI2ViIhIRWysREREKmJjJSIiUhEbKxERkYoK/P1YX5der8ft27fh6OgInU6ndRwiItKAEAKPHj2Cl5cXzMyyXydlY32J27dvw9vbW+sYREQkgaioKJQsWTLbadhYX8LR0RFAejGdnJw0TkNERFpISEiAt7e30hOyw8b6Ehmbf52cnNhYiYgKuZzsEuTBS0RERCpiYyUiIlIRNwUTEVG+c3PcAVXnV3J2Y9XmxcaqkrS0NDx9+lTrGEREmrO0tIS5ubnWMTTDxvqahBCIiYnBw4cPtY5CRCQNFxcXeHp6Fsrz/9lYX1NGU3V3d4ednV2h/BIREWUQQuDx48eIjY0FABQvXlzjRKbHxvoa0tLSlKbq6uqqdRwiIinY2toCAGJjY+Hu7l7oNgvzqODXkLFP1c7OTuMkRERyyfhdLIzHnrCxqoCbf4mIDBXm30U2ViIiIhWxsVKe69OnDzp16qTJez9+/BjvvPMOnJycoNPp8PDhQ6PDfHx8sGjRotd+v7Vr18LFxeW15yODwMBADB8+XOsYRl26dAn169eHjY0NqlevbtL3Dg4OVr43ssoPGQsyHryUB9Q+cfllcnNic2BgIKpXr/5KzSQ3rzFFruysW7cOBw4cQGhoKIoVKwZnZ2d88803mYYdP34c9vb2r/1+3bp1Q9u2bVVITtmZPHky7O3t8c8//8DBwUHrOAXO9evX4evri9OnT5v8Hy4FARsr5TtCCKSlpcHC4uVf3/DwcPj7+6Ny5crZDnNzc1Mlm62trXJEJGWWlpYGnU730vtZvkx4eDjatWuH0qVLq5SMSD3cFFwI9enTByEhIVi8eDF0Oh10Oh2uX7+OkJAQ1K1bF9bW1ihevDjGjRuHZ8+eZfuatLQ09OvXD76+vrC1tUWFChWwePFiVXNlbNbas2cPateuDWtraxw4cADh4eHo2LEjPDw84ODggDp16uCPP/5Q5hcYGIj58+dj//790Ol0CAwMNDoMQKZNwQ8fPsSAAQPg4eEBGxsbVK5cGTt27HjpZ3hxU/CUKVNQvXp1rF+/Hj4+PnB2dsb777+PR48e5agmgYGBGDZsGMaMGYOiRYvC09MTU6ZMUcZfv34dOp0OYWFhBtl1Oh2Cg4MBwKB+NWrUgK2tLZo3b47Y2Fj8/vvv8Pf3h5OTEz744AM8fvzY4P2fPXuGIUOGwMXFBa6urvjiiy8ghFDGp6amYsyYMShRogTs7e1Rr1495X2fr8eOHTsQEBAAa2tr3LhxI9vPrNfrMW3aNJQsWRLW1taoXr06du/erYzX6XQ4efIkpk2bBp1OZ1APY9555x0MHTpUeT58+HDodDqcP39e+YyOjo7Ys2cPgPR/uM2ZMwdlypSBra0tqlWrhp9//jnTfA8dOoRq1arBxsYG9erVw7lz57LN8WJNfvnlF5QvXx42NjZ48803ERUVpUzzsu82AKSkpGDMmDHw9vaGtbU1ypUrh++++87oeyYnJ6Ndu3aoX78+7t+/DwBYs2YN/P39YWNjg4oVK+Lrr79Wpvf19QUA1KhRw+DvJDg4GHXr1oW9vT1cXFzQqFGjly7PwoiNtRBavHgxGjRogP79+yM6OhrR0dGwtLRE27ZtUadOHZw5cwbLly/Hd999h+nTp2f5Gm9vb+j1epQsWRKbN2/GhQsXMGnSJPznP//B5s2bVcn1/E3mx4wZg1mzZuHixYuoWrUqEhMT0bZtW/zxxx84ffo0WrVqhfbt2yMyMhIAsHXrVvTv3x8NGjRAdHQ0tm7danTYi/R6Pdq0aYPQ0FD88MMPuHDhAmbPnp3rc/HCw8Pxyy+/YMeOHdixYwdCQkIwe/bsHL9+3bp1sLe3x9GjRzFnzhxMmzYN+/bte+UcU6ZMwbJlyxAaGoqoqCh07doVixYtwoYNG7Bz507s27cPS5cuzfTeFhYWOHr0KJYsWYKFCxdi1apVyviPPvoIhw4dwsaNG3H27Fm89957aN26Na5cuaJM8/jxY8yaNQurVq3C+fPn4e7unm3OxYsXY/78+Zg3bx7Onj2LVq1aoUOHDso8o6OjUalSJYwcORLR0dEYNWpUtvMLDAw0aPYhISEoVqwYQkJCAADHjx/HkydP0KhRIwDAF198gTVr1mD58uU4f/48Pv/8c3z44YfK9BlGjx6NefPm4fjx43B3d0eHDh1yfGrJ48ePMWPGDKxbtw6HDh1CQkIC3n//fWX8y77bANCrVy9s3LgRS5YswcWLF/HNN98Y3SweHx+Pt956C6mpqQgKCkLRokXx7bffYsKECZgxYwYuXryImTNnYuLEiVi3bh0A4NixYwCAP/74Q/k7efbsGTp16oSmTZvi7NmzOHz4MAYMGFCoj/7NCjcFF0LOzs6wsrKCnZ0dPD09AQATJkyAt7c3li1bBp1Oh4oVK+L27dsYO3YsJk2aZPQ1AGBubo6pU6cqz319fREaGorNmzeja9eur53redOmTcObb76pPHd1dUW1atWU59OnT8e2bduwfft2DBkyBEWLFoWdnR2srKwM5mds2PP++OMPHDt2DBcvXkT58uUBAGXKlHmlz/I8vV6PtWvXKjdI7tmzJ4KCgjBjxowcvb5q1aqYPHkyAKBcuXJYtmwZgoKCDGqRE9OnT1eaR79+/TB+/HiEh4crn+3dd9/FX3/9hbFjxyqv8fb2xsKFC6HT6VChQgWcO3cOCxcuRP/+/REeHo6ffvoJN2/ehJeXFwBg1KhR2L17N9asWYOZM2cCSD+P8euvvzZYVtmZN28exo4dqzSar776Cn/99RcWLVqE//73v/D09ISFhQUcHByyXIbPCwwMxGeffYa7d+/C3Nwc58+fx+TJkxEcHIxBgwYhODgYtWrVgoODA5KSkrBgwQL8+eefaNCgAYD0ZX/w4EGsWLECTZs2VeY7efJkZRmsW7cOJUuWxLZt23L0vX/69CmWLVuGevXqKa/39/fHsWPHULduXVSrVi3b7/bly5exefNm7Nu3Dy1btlRyvujOnTvo1q0bypYti59++glWVlYAgC+//BLz589Hly5dAKT/3V64cAErVqxA7969lV0jrq6uSo3v37+P+Ph4vP322yhbtiwAwN/f/6WftTBiYyUAwMWLF9GgQQODf302atQIiYmJuHnzJkqVKpXla7/55husWrUKN27cQHJyMlJTU/PkgIfatWsbPE9KSsLUqVOxY8cO3L59G8+ePUNycrLBv+pzIywsDCVLllSa6uvy8fFRmiqQfom3jMu95UTVqlUNnr/q643Nx8PDA3Z2dgY/xh4eHsqaSob69esbfCcaNGiA+fPnIy0tDadOnYIQIlOdUlJSDK5EZmVllekzZCUhIQG3b99W/gGQoVGjRjhz5kyO5vGiypUrw9XVFSEhIbC0tES1atXQoUMHLFmyBED65s2MhnnhwgU8efIk0z9aUlNTUaNGDYNhGY0XAIoWLYoKFSrg4sWLOcpkYWFh8H2uWLEiXFxccPHiRdStW/el3+2wsDCYm5sbNHpjWrZsiTp16mDz5s3KFpe4uDhERUWhX79+6N+/vzLts2fP4OzsnOW8ihYtij59+qBVq1Z488030bJlS3Tt2rVQXrLwZdhYCUD6fqUXN+lk7EvLblPP5s2b8fnnn2P+/Plo0KABHB0dMXfuXBw9elT1jC8etTt69Gjs2bMH8+bNg5+fH2xtbfHuu+8iNTX1td5H7YOPLC0tDZ7rdDro9XpVXp9xENDz+z2z2hz5/Hx0Ot1r59Lr9TA3N8fJkyczbSZ/fpOkra3tK28uNPZdzO0mR51OhyZNmiA4OBhWVlYIDAxE5cqVkZaWhnPnziE0NFQ5rSjj8+/cuRMlSpQwmI+1tfUr537VaTOGvey7ndPvaLt27bBlyxZcuHABVapUAfDvZ/z222+VNeYML9vdsWbNGgwbNgy7d+/Gpk2b8MUXX2Dfvn2oX79+jvIUFmyshZSVlRXS0tKU5wEBAdiyZYvBD1hoaCgcHR2VH5gXXwMABw4cQMOGDTFo0CBlWHh4uGq5snPgwAH06dMHnTt3BpC+X+r69eu5fu8MVatWxc2bN3H58mXV1lrzSsYmu+joaGWN6vkDmV7XkSNHMj0vV64czM3NUaNGDaSlpSE2NhaNG6tzL0snJyd4eXnh4MGDaNKkiTI8NDQUdevWzfV8AwMDsXLlSlhZWSkHPTVu3Bjz5s1DcnKysoaccYBVZGTkS9cGjxw5omzJefDgAS5fvoyKFSvmKM+zZ89w4sQJ5TP9888/ePjwofL6l323q1SpAr1ej5CQEGVTsDGzZ8+Gg4MDWrRogeDgYAQEBMDDwwMlSpTAtWvX0KNHD6Ovy9hkbOxvsUaNGqhRowbGjx+PBg0aYMOGDWysL2BjLaR8fHxw9OhRXL9+HQ4ODhg0aBAWLVqEoUOHYsiQIfjnn38wefJkjBgxQlkrevE1RYsWhZ+fH77//nvs2bMHvr6+WL9+PY4fP64cVfi6uYoWLZrltH5+fti6dSvat28PnU6HiRMnvtIaV1aaNm2KJk2a4J133sGCBQvg5+eHS5cuQafToXXr1q89fzXZ2tqifv36mD17Nnx8fHD37l188cUXqs0/KioKI0aMwCeffIJTp05h6dKlmD9/PgCgfPny6NGjB3r16oX58+ejRo0auHv3Lv78809UqVIl1+fzjh49GpMnT0bZsmVRvXp1rFmzBmFhYfjxxx9z/Tky9rNaWFgo/wgIDAzEyJEjUbNmTTg5OQEAHB0dMWrUKHz++efQ6/V44403kJCQgNDQUDg4OKB3797KPKdNmwZXV1d4eHhgwoQJKFasWI4vhGJpaYmhQ4diyZIlsLS0xJAhQ1C/fn2l0b7su+3j44PevXujb9++WLJkCapVq4YbN24gNjY20z7eefPmIS0tDc2bN0dwcDAqVqyIKVOmYNiwYXByckKbNm2QkpKCEydO4MGDBxgxYgTc3d1ha2uL3bt3o2TJkrCxscH9+/excuVKdOjQAV5eXvjnn39w+fJl9OrVK9fLpaDiUcGF1KhRo2Bubo6AgAC4ubnh6dOn2LVrF44dO4Zq1aph4MCB6Nevn8GP9IuviYyMxMCBA9GlSxd069YN9erVw7179wzWXl83V3b7SxcuXIgiRYqgYcOGaN++PVq1aoWaNWvm+r2ft2XLFtSpUwcffPABAgICMGbMmByvSZva6tWr8fTpU9SuXRufffaZciS3Gnr16oXk5GTUrVsXgwcPxtChQzFgwABl/Jo1a9CrVy+MHDkSFSpUQIcOHXD06FGDo7lf1bBhwzBy5EiMHDkSVapUwe7du7F9+3aUK1cu1/OsXLkyihUrhmrVqilNtGnTpkhLS8u0Zvrll19i0qRJmDVrFvz9/dGqVSv89ttvmf6xOHv2bHz22WeoVasWoqOjsX37dmVN72Xs7OwwduxYdO/eHQ0aNICtrS02btyojM/Jd3v58uV49913MWjQIFSsWBH9+/dHUlKS0fdbuHAhunbtiubNm+Py5cv4+OOPsWrVKqxduxZVqlRB06ZNsXbtWuUzWlhYYMmSJVixYgW8vLzQsWNH2NnZ4dKlS3jnnXdQvnx5DBgwAEOGDMEnn3ySo89cmOjE8ztnKJOEhAQ4OzsjPj5e+YPM8OTJE0RERMDX1xc2NjYaJSSi/GTt2rUYPnx4gb/cYF7/Pqp9hbuXXcEuu17wIq6xEhERqYiNlUwmMjISDg4OWT5e9zQZU2jTpk2W+TPO28ypglCP3MjuMx848OprITNnzsxyfm3atMmDT5A9Nb8jlD/x4CUyGS8vr2yPWM24yIDMVq1aheTkZKPjsjvQypiCUI/cyO4zv3iKS04MHDgwy4syaHHd5pd9RzLOB6WCi42VTMbCwgJ+fn5ax3gtufnhz0pBqEduqP2ZM5qVLNT8jlD+xE3BREREKmJjVYEa504SERUkhfl3kZuCX4OVlRXMzMxw+/ZtuLm5wcrKind6IKJCTQiB1NRUxMXFwczMLMfn9hYkbKyvwczMDL6+voiOjsbt27e1jkNEJA07OzuUKlXqtW9qnx+xsb4mKysrlCpVCs+ePZP2yjxERKZkbm4OCwuLQrsFj41VBRl3CnnxbiFERFT4FL51dCIiojzExkpERKQiNlYiIiIVsbESERGpiI2ViIhIRWysREREKmJjJSIiUhEbKxERkYrYWImIiFTExkpERKQiNlYiIiIVsbESERGpiI2ViIhIRWysREREKtKksU6ZMgU6nc7g4enpqYwXQmDKlCnw8vKCra0tAgMDcf78eYN5pKSkYOjQoShWrBjs7e3RoUMH3Lx502CaBw8eoGfPnnB2doazszN69uyJhw8fmuIjEhFRIaXZGmulSpUQHR2tPM6dO6eMmzNnDhYsWIBly5bh+PHj8PT0xJtvvolHjx4p0wwfPhzbtm3Dxo0bcfDgQSQmJuLtt982uNl49+7dERYWht27d2P37t0ICwtDz549Tfo5iYiocNHsRucWFhYGa6kZhBBYtGgRJkyYgC5dugAA1q1bBw8PD2zYsAGffPIJ4uPj8d1332H9+vVo2bIlAOCHH36At7c3/vjjD7Rq1QoXL17E7t27ceTIEdSrVw8A8O2336JBgwb4559/UKFCBdN9WCIiKjQ0W2O9cuUKvLy84Ovri/fffx/Xrl0DAERERCAmJgZvvfWWMq21tTWaNm2K0NBQAMDJkyfx9OlTg2m8vLxQuXJlZZrDhw/D2dlZaaoAUL9+fTg7OyvTGJOSkoKEhASDBxERUU5p0ljr1auH77//Hnv27MG3336LmJgYNGzYEPfu3UNMTAwAwMPDw+A1Hh4eyriYmBhYWVmhSJEi2U7j7u6e6b3d3d2VaYyZNWuWsk/W2dkZ3t7er/VZiYiocNGksbZp0wbvvPMOqlSpgpYtW2Lnzp0A0jf5ZtDpdAavEUJkGvaiF6cxNv3L5jN+/HjEx8crj6ioqBx9JiIiIkCS023s7e1RpUoVXLlyRdnv+uJaZWxsrLIW6+npidTUVDx48CDbae7cuZPpveLi4jKtDT/P2toaTk5OBg8iIqKckqKxpqSk4OLFiyhevDh8fX3h6emJffv2KeNTU1MREhKChg0bAgBq1aoFS0tLg2mio6Px999/K9M0aNAA8fHxOHbsmDLN0aNHER8fr0xDRESkNk2OCh41ahTat2+PUqVKITY2FtOnT0dCQgJ69+4NnU6H4cOHY+bMmShXrhzKlSuHmTNnws7ODt27dwcAODs7o1+/fhg5ciRcXV1RtGhRjBo1Stm0DAD+/v5o3bo1+vfvjxUrVgAABgwYgLfffptHBBMRUZ7RpLHevHkTH3zwAe7evQs3NzfUr18fR44cQenSpQEAY8aMQXJyMgYNGoQHDx6gXr162Lt3LxwdHZV5LFy4EBYWFujatSuSk5PRokULrF27Fubm5so0P/74I4YNG6YcPdyhQwcsW7bMtB+WiIgKFZ0QQmgdQmYJCQlwdnZGfHw897cSEUni5rgDqs6v5OzG2Y5/lV4gxT5WIiKigoKNlYiISEVsrERERCpiYyUiIlKRZhfhJ9Mx9U5+IqLCjGusREREKmJjJSIiUhEbKxERkYrYWImIiFTExkpERKQiNlYiIiIVsbESERGpiI2ViIhIRWysREREKmJjJSIiUhEbKxERkYrYWImIiFTEi/CTpniDACIqaLjGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhXxkoZEWVDzcou81CJR4cE1ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRinjbOBXxNmNERMQ1ViIiIhUVisb69ddfw9fXFzY2NqhVqxYOHFBvzZKIiOh5Bb6xbtq0CcOHD8eECRNw+vRpNG7cGG3atEFkZKTW0YiIqAAq8I11wYIF6NevHz7++GP4+/tj0aJF8Pb2xvLly7WORkREBVCBPngpNTUVJ0+exLhx4wyGv/XWWwgNDTX6mpSUFKSkpCjP4+PjAQAJCQkvfb9HKUmvkdZQTt4vp9TMBTBbbqiZCwBuTTb+/c2NElMbqjYvNXMBzJYbauaSmal/OzLGCyFePjNRgN26dUsAEIcOHTIYPmPGDFG+fHmjr5k8ebIAwAcffPDBBx+ZHlFRUS/tPQV6jTWDTqczeC6EyDQsw/jx4zFixAjluV6vx/379+Hq6prla3IqISEB3t7eiIqKgpOT02vNS23MljuyZpM1F8BsuSVrNllzAepmE0Lg0aNH8PLyeum0BbqxFitWDObm5oiJiTEYHhsbCw8PD6Ovsba2hrW1tcEwFxcXVXM5OTlJ9wXMwGy5I2s2WXMBzJZbsmaTNRegXjZnZ+ccTVegD16ysrJCrVq1sG/fPoPh+/btQ8OGhWM/BBERmVaBXmMFgBEjRqBnz56oXbs2GjRogJUrVyIyMhIDBw7UOhoRERVABb6xduvWDffu3cO0adMQHR2NypUrY9euXShdurTJs1hbW2Py5MmZNjXLgNlyR9ZssuYCmC23ZM0may5Au2w6IXJy7DARERHlRIHex0pERGRqbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpKICfz/W16XX63H79m04OjpCp9NpHYeIiDQghMCjR4/g5eUFM7Ps10nZWF/i9u3b8Pb21joGERFJICoqCiVLlsx2GjbWl3B0dASQXkwnJyeN0xARkRYSEhLg7e2t9ITssLG+RMbmXycnJzZWIqJCLie7BHnwEhERkYrYWImIiFTETcFERJTvTJkyRdr5sbFSoZSWloanT59qHYOIcsnBwUHV+T158gSWlpYwNzd/7XmxsVKhIoRATEwMHj58qHUUInoNjRo1UnV+ERERAAAXFxd4enq+1nUL2FipUMloqu7u7rCzs+NFP4jyqdjYWFXn5+bmhsePHyvzLV68eK7nxcZKhUZaWprSVF1dXbWOQ0SvwcJC3fZla2sLW1tbAOlN293dPdebhXlUMBUaGftU7ezsNE5CRLLK+H14nWMw2Fip0OHmXyLKihq/D2ysREREKmJjJSIDffr0QadOnbSOkSsxMTF48803YW9vDxcXF5O+d3BwMHQ6naZHnK9du9bkn1s2oaGhKFGiBOLj4zXLwIOXiKD+yeZqv1dgYCCqV6+ORYsW5elrTJErLy1cuBDR0dEICwuDs7Nznr2Psc/dsGFDREdH5+n7vky3bt3Qtm1bzd6f0rGxElGeEkIgLS1N9aM4jQkPD0etWrVQrly5XM/j6dOnsLS0fOXXWVlZwdPTM9fvq4bnj2wl7XBTMJHk+vTpg5CQECxevBg6nQ46nQ7Xr19HSEgI6tatC2traxQvXhzjxo3Ds2fPsn1NWloa+vXrB19fX9ja2qJChQpYvHixqrkyNonu2bMHtWvXhrW1NQ4cOIDw8HB07NgRHh4ecHBwQJ06dfDHH38YzNPHxwczZ85E37594ejoiFKlSmHlypXK+NTUVAwZMgTFixeHjY0NfHx8MGvWLOW1W7Zswffffw+dToc+ffoAAOLj4zFgwAC4u7vDyckJzZs3x5kzZ5R5TpkyBdWrV8fq1atRpkwZWFtbQwiR68+dsSk4Y7Psjh07UKFCBdjZ2eHdd99FUlIS1q1bBx8fHxQpUgRDhw5FWlqawWccM2YMSpQoAXt7e9SrVw/BwcE5WiYvbgrO+Gzr16+Hj48PnJ2d8f777+PRo0c5mt/PP/+MKlWqwNbWFq6urmjZsiWSkpKU8WvWrIG/vz9sbGxQsWJFfP311wavv3nzJt5//30ULVoU9vb2qF27No4ePaqMX758OcqWLQsrKytUqFAB69evN3i9TqfDqlWr0LlzZ9jZ2aFcuXLYvn27wTRBQUF44403ULZsWbz77ruIiorKlKF3794ICAiAn58fmjVrhqCgoBx9/tziGiuR5BYvXozLly+jcuXKmDZtGoD0c3Lbtm2LPn364Pvvv8elS5fQv39/2NjYYMqUKUZf4+bmBr1ej5IlS2Lz5s0oVqwYQkNDMWDAABQvXhxdu3Z97Vxubm64fv06AGDMmDGYN28eypQpAxcXF9y8eRNt27bF9OnTYWNjg3Xr1qF9+/b4559/UKpUKWW+8+fPx5dffon//Oc/+Pnnn/Hpp5+iSZMmqFixIpYsWYLt27dj8+bNKFWqFKKiopQf0uPHj6NXr15wcnLC4sWLYWtrCyEE2rVrh6JFi2LXrl1wdnbGihUr0KJFC1y+fBlFixYFAFy9ehWbN2/Gli1bXnru4ss+9/MeP36MJUuWYOPGjXj06BG6dOmCLl26wMXFBbt27cK1a9fwzjvv4I033kC3bt0AAB999BGuX7+OjRs3wsvLC9u2bUPr1q1x7ty5XK2Jh4eH45dffsGOHTvw4MEDdO3aFbNnz8aMGTOyfV10dDQ++OADzJkzB507d8ajR49w4MAB5R8d3377LSZPnoxly5ahRo0aOH36NPr37w97e3v07t0biYmJaNq0KUqUKIHt27fD09MTp06dgl6vBwBs27YNn332GRYtWoSWLVtix44d+Oijj1CyZEk0a9ZMyTF16lTMmTMHc+fOxdKlS9GjRw/cuHEDAHDr1i30798fH374IXr16oWzZ88qyyTDf/7zHzx9+hRbtmyBnZ0dLl++DHt7+1eu46tgYyWSnLOzM6ysrGBnZ6dsapwwYQK8vb2xbNky6HQ6VKxYEbdv38bYsWMxadIko68BAHNzc0ydOlV57uvri9DQUGzevPmVG2tW75Fh2rRpePPNN5Xnrq6uqFatmvJ8+vTp2LZtG7Zv344hQ4Yow9u2bYtBgwYBAMaOHYuFCxciODgYFStWRGRkJMqVK4c33ngDOp0OpUuXVl7n5uYGa2tr2NraKnn+/PNPnDt3DrGxsbC2tgYAzJs3D7/88gt+/vlnDBgwAED6WuL69evh5ub22p/7eU+fPlXWygDg3Xffxfr163Hnzh04ODggICAAzZo1w19//YVu3bohPDwcP/30E27evAkvLy8AwKhRo7B7926sWbMGM2fOfGm+F+n1eqxdu1a5QXfPnj0RFBSUo8b67NkzdOnSRalzlSpVlPFffvkl5s+fjy5dugBI/y5duHABK1asQO/evbFhwwbExcXh+PHjyj9g/Pz8lNfPmzcPffr0UZb1iBEjcOTIEcybN8+gsfbp0wcffPABAGDmzJlYunQpjh07hqpVq+L7779HqVKlMHXqVOh0Ovj5+eHSpUv473//q7z+9u3baNu2Lfz9/QHA4DuTV7gpmCgfunjxIho0aGBwzl2jRo2QmJiImzdvZvvab775BrVr14abmxscHBzw7bffIjIyUvWMtWvXNnielJSEMWPGICAgAC4uLnBwcMClS5cyvXfVqlWV/9fpdPD09FQuM9enTx+EhYWhQoUKGDZsGPbu3ZtthpMnTyIxMRGurq5wcHBQHhEREQgPD1emK126dI6a6quys7NTmioAeHh4wMfHx+AC8h4eHsrnO3XqFIQQKF++vEHekJAQg7yvwsfHR2mqQPql+nJyOcBq1aqhRYsWqFKlCt577z18++23ePDgAQAgLi4OUVFR6Nevn0HO6dOnKznDwsJQo0YNpam+6OLFi5mu99uoUSNcvHjRYNjz3wd7e3s4Ojoq+a9evYqaNWsa/B3UqlXL4PV9+/bF4sWL0bFjR8ybNw8XLlx46Wd/XVxjJcqHhBCZTmTP2ESX3Qnumzdvxueff4758+ejQYMGcHR0xNy5cw32e6nlxc1to0ePxp49ezBv3jz4+fnB1tYW7777LlJTUw2me/HAIZ1Op2w+rFmzJiIiIvD777/jjz/+QNeuXdGyZUv8/PPPRjPo9XoUL17c6D7K5/dF5tWmQWOfJbvPp9frYW5ujpMnT2baJJ3bu7lk937ZMTc3x759+xAaGoq9e/di6dKlmDBhAo4ePapcnejbb79FvXr1Mr0OQI4OojL2HX5xWHb5s9sXnqF79+5o2rQpgoKCsH//fixbtgyTJk1C3759X/ra3GJjLQRkvm8h5YyVlZXBAS4BAQHYsmWLwQ9RaGgoHB0dUaJECaOvAYADBw6gYcOGyuY3ALleE8rqPbJy4MAB9OnTB507dwYAJCYmGt0v+TJOTk7o1q0bunXrhnfffRetW7fG/fv3ja4Z1axZEzExMbCwsICPj88rv1dWXuVzv4oaNWogLS0NsbGxaNy4serzf1U6nQ6NGjVCo0aNMGnSJJQuXRrbtm3DiBEjUKJECVy7dg09evQw+tqqVati1apVWS4bf39/HDx4EL169VKGhYaGKptsc6JcuXLYs2ePwbBTp05lmq5EiRLo1asXevXqhVmzZmHDhg152li5KZgoH/Dx8cHRo0dx/fp13L17F4MGDUJUVBSGDh2KS5cu4ddff8XkyZMxYsQImJmZGX2NXq+Hn58fTpw4gT179uDy5cuYOHEijh8/rlqu7NaE/Pz8sHXrVoSFheHMmTPo3r17jtacnrdw4UJs3LgRly5dwuXLl/G///0Pnp6eWV4UoWXLlmjQoAE6deqEPXv24Pr16wgNDcUXX3yBEydOvNJ7P+9VPverKF++PHr06IFevXph69atiIiIwPHjx/HVV19h165dqrxHTh09ehQzZ87EiRMnEBkZia1btyIuLk5pfFOmTMGsWbOUg7nOnTuHNWvWYMGCBQCADz74AJ6enujUqRMOHTqEa9euYcuWLTh8+DCA9C0Ya9euxTfffIMrV65gwYIF2Lp1K0aNGpXjjL169cKNGzcwZcoUXL16Fdu2bcPmzZsNppk0aRKCg4MRGRmJc+fO4dChQwb7evMC11iJIP9a+KhRo5RTBpKTkxEREYFdu3Zh9OjRqFatGooWLYp+/frhiy++yPY1AwcORFhYGLp16wadTocPPvgAgwYNwu+//65arqwsXLgQffv2RcOGDVGsWDGMHTsWCQkJr/R+Dg4O+Oqrr3DlyhWYm5ujTp062LVrl/KPiRfpdDrs2rULEyZMQN++fREXFwdPT080adIEHh4er/Tez3uVz/2q1qxZg+nTp2PkyJG4desWXF1d0aBBA5Nf+MHJyQn79+/HokWLkJCQgNKlS2P+/Plo06YNAODjjz+GnZ0d5s6dizFjxsDe3h5VqlTB8OHDAaSv1e/duxcjR45E27Zt8ezZMwQEBCgHFnXq1AmLFy/G3LlzMWzYMPj6+mLNmjUIDAzMccYSJUpg5cqVmDJlCr7//ntUr14d48aNw4gRI5Rp9Ho9JkyYgOjoaDg4OCAwMDDP/951IicbqQuxhIQEODs7Iz4+Hk5OTlrHyRVuCk735MkTREREwNfXFzY2NlrHIaLXcPv2bVXnl3EUdla/E6/SC7gpmIiISEVsrERkVGRkpMGpFC8+8uIUHRnI/LnbtGmTZa5XPcdV5s+Z33EfKxEZ5eXlhbCwsGzHF0Qyf+5Vq1YhOTnZ6LiszhfNisyfM79jYyUioywsLPL86EkZyfy5M06lUoPMnzO/46ZgKnR4vB4RZUWN3wc2Vio0Mq7g8vjxY42TEJGsMn4fcnPrwAzcFEyFhrm5OVxcXJTrjNrZ2WV7+T8iklfGLRLVkpycjMePHyM2NhYuLi4vvctRdthYqVDJuBtJTi5CTkTyyrjvrVoy7jPr4uLy2jesZ2OlQkWn06F48eJwd3fH06dPtY5DRLm0bNkyVec3ZMgQWFpavtaaagY2ViqUzM3NVfkDIiJtJCYmqjo/Na/GxoOXiIiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqyteNdf/+/Wjfvj28vLyg0+nwyy+/GIwXQmDKlCnw8vKCra0tAgMDcf78eW3CEhFRoZCvG2tSUhKqVauW5Q1v58yZgwULFmDZsmU4fvw4PD098eabb+LRo0cmTkpERIVFvr7ReZs2bdCmTRuj44QQWLRoESZMmIAuXboAANatWwcPDw9s2LABn3zyiSmjEhFRIZGv11izExERgZiYGLz11lvKMGtrazRt2hShoaFZvi4lJQUJCQkGDyIiopwqsI01JiYGAODh4WEw3MPDQxlnzKxZs+Ds7Kw8vL298zQnEREVLAW2sWbQ6XQGz4UQmYY9b/z48YiPj1ceUVFReR2RiIgKkHy9jzU7np6eANLXXIsXL64Mj42NzbQW+zxra2tYW1vneT4iIiqYCuwaq6+vLzw9PbFv3z5lWGpqKkJCQtCwYUMNkxERUUGWr9dYExMTcfXqVeV5REQEwsLCULRoUZQqVQrDhw/HzJkzUa5cOZQrVw4zZ86EnZ0dunfvrmFqIiIqyPJ1Yz1x4gSaNWumPB8xYgQAoHfv3li7di3GjBmD5ORkDBo0CA8ePEC9evWwd+9eODo6ahWZiIgKuHzdWAMDAyGEyHK8TqfDlClTMGXKFNOFIiKiQq3A7mMlIiLSAhsrERGRithYiYiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhVZaB2gIJkyZYqU8yIiItPhGisREZGK2FiJiIhUxE3BRFngpn0iyg02VtKU2g2HDYyItMZNwURERCpiYyUiIlIRGysREZGK2FiJiIhUxMZKRESkIjZWIiIiFbGxEhERqYiNlYiISEVsrERERCpiYyUiIlIRL2lIRKQxXpe6YCkUjfXrr7/G3LlzER0djUqVKmHRokVo3Lix1rGIck3WH2KZr/0sczYqWAr8puBNmzZh+PDhmDBhAk6fPo3GjRujTZs2iIyM1DoaEREVQAW+sS5YsAD9+vXDxx9/DH9/fyxatAje3t5Yvny51tGIiKgAKtCbglNTU3Hy5EmMGzfOYPhbb72F0NBQo69JSUlBSkqK8jw+Ph4AkJCQ8NL3e/51rysn75dTauYCmC031MwFyJutsCxPQN5san/XZGXq5ZkxXgjx8pmJAuzWrVsCgDh06JDB8BkzZojy5csbfc3kyZMFAD744IMPPvjI9IiKinpp7ynQa6wZdDqdwXMhRKZhGcaPH48RI0Yoz/V6Pe7fvw9XV9csX5NTCQkJ8Pb2RlRUFJycnF5rXmpjttyRNZusuQBmyy1Zs8maC1A3mxACjx49gpeX10unLdCNtVixYjA3N0dMTIzB8NjYWHh4eBh9jbW1NaytrQ2Gubi4qJrLyclJui9gBmbLHVmzyZoLYLbckjWbrLkA9bI5OzvnaLoCffCSlZUVatWqhX379hkM37dvHxo2bKhRKiIiKsgK9BorAIwYMQI9e/ZE7dq10aBBA6xcuRKRkZEYOHCg1tGIiKgAKvCNtVu3brh37x6mTZuG6OhoVK5cGbt27ULp0qVNnsXa2hqTJ0/OtKlZBsyWO7JmkzUXwGy5JWs2WXMB2mXTCZGTY4eJiIgoJwr0PlYiIiJTY2MlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWIiEhFbKxEREQqYmMlIiJSERsrERGRithYiYiIVMTGSkREpCI2ViIiIhUV+Puxvi69Xo/bt2/D0dEROp1O6zhERKQBIQQePXoELy8vmJllv07KxvoSt2/fhre3t9YxiIhIAlFRUShZsmS207CxvoSjoyOA9GI6OTlpnIaIiLSQkJAAb29vpSdkh431JTI2/zo5ObGxEhEVcjnZJciDl4iIiFTExkpERKQibgomIqJ8J+jPsqrOr0XzcNXmxcZKhUpaWhqePn2qdQwiek1mZl6qzu/JkycwNzeHhYXFa59aycZKhUZiYiJu3rwJIYTWUYjoNbk4T1Z1fhEREQAAOzs7FC9eHFZWVrmeFxsrFQppaWm4efMm7Ozs4Obmxot9EOVziYnqbnmyt/dBamoq4uLiEBERgXLlyr30QhBZYWOlQuHp06cQQsDNzQ22trZaxyGi15Saqu4/jm1tbWFrawtLS0vcuHEDqampsLGxydW8eFQwFSpcUyWi7OR2LdVgHirkICIiov/HxkpERKQi7mOlQk3tc+FeRs1z5WS3du1aDB8+HA8fPtQ6yktdv34dvr6+OH36NKpXr56reQQGBqJ69epYtGiRqtlehY+PD4YPH47hw4drlkFr7dr1RZUqFTB79ljNMnCNlagAmzJlSq4bhZaCg4Oh0+leuSnn9nVqvMfWrVvx5Zdf5tn75sTx48cxYMAATTMQ11iJKA8UxotwFC1aVOsIcHNz0zoCgWusRFILDAzEsGHDMGbMGBQtWhSenp6YMmWKMj4+Ph4DBgyAu7s7nJyc0Lx5c5w5cwZA+qbYqVOn4syZM9DpdNDpdFi7di1GjhyJ9u3bK/NYtGgRdDoddu7cqQyrUKECVqxYAQDQ6/WYNm0aSpYsCWtra1SvXh27d+9Wpr1+/Tp0Oh02b96MwMBA2NjY4Icffsj0We7du4e6deuiQ4cOePLkSZaf+fr162jWrBkAoEiRItDpdOjTpw8AICUlBcOGDYO7uztsbGzwxhtv4Pjx4y993e7du/HGG2/AxcUFrq6uePvttxEe/uqb5bN7j8DAQINNsD4+Ppg+fTp69eoFBwcHlC5dGr/++ivi4uLQsWNHODg4oEqVKjhx4oTBe4SGhqJJkyawtbWFt7c3hg0bhqSkpBzl8/HxMdgUrdPpsGrVKnTu3Bl2dnYoV64ctm/fnqN5PXjwAD169FBOUStXrhzWrFmjjL916xa6deuGIkWKwNXVFR07dsT169cN5rF69WpUqlQJ1tbWKF68OIYMGaKMi4yMVOrg5OSErl274s6dO8r4jK0t69evh4+PD5ydnfH+++/j0aNHyjRJSY/xySf/gZdXPZQv3xxLl67L9Dm+/XYjatR4G+7uteHnF4iePUfk6PO/DjZWIsmtW7cO9vb2OHr0KObMmYNp06Zh3759EEKgXbt2iImJwa5du3Dy5EnUrFkTLVq0wP3799GtWzeMHDkSlSpVQnR0NKKjo9GtWzcEBgbiwIED0Ov1AICQkBAUK1YMISEhAICYmBhcvnwZTZs2BQAsXrwY8+fPx7x583D27Fm0atUKHTp0wJUrVwxyjh07FsOGDcPFixfRqlUrg3E3b95E48aNUbFiRWzdujXb8wO9vb2xZcsWAMA///yD6OhoLF68GAAwZswYbNmyBevWrcOpU6fg5+eHVq1a4f79+9m+LikpCSNGjMDx48cRFBQEMzMzdO7cWalBTmX3HsYsXLgQjRo1wunTp9GuXTv07NkTvXr1wocffqjk79Wrl3I1sHPnzqFVq1bo0qULzp49i02bNuHgwYMGDelVTZ06FV27dsXZs2fRtm1b9OjRA/fv33/p6yZOnIgLFy7g999/x8WLF7F8+XIUK1YMAPD48WM0a9YMDg4O2L9/Pw4ePAgHBwe0bt0aqampAIDly5dj8ODBGDBgAM6dO4ft27fDz88PACCEQKdOnXD//n2EhIRg3759CA8PR7du3QwyhIeH45dffsGOHTuwY8cOhISEYPbs2c9lXIADB47jhx8WYdu2b3Dw4HGEhV1Qxp86dR5jx36FCRMG4cSJ7diyZTkaNaqV61rmmKBsxcfHCwAiPj5e6yj0GpKTk8WFCxdEcnKywfA/gsqY9PGqmjZtKt544w2DYXXq1BFjx44VQUFBwsnJSTx58sRgfNmyZcWKFSuEEEJMnjxZVKtWzWD8w4cPhZmZmThx4oTQ6/XC1dVVzJo1S9SpU0cIIcSGDRuEh4eHMr2Xl5eYMWNGpgyDBg0SQggREREhAIhFixYZTLNmzRrh7Ows/vnnH1GqVCkxdOhQodfrc/S5//rrLwFAPHjwQBmWmJgoLC0txY8//qgMS01NFV5eXmLOnDlZvs6Y2NhYAUCcO3fO4DOcPn06V9mESF9Wn332mfK8dOnS4sMPP1SeR0dHCwBi4sSJyrDDhw8LACI6OloIIUTPnj3FgAEDDOZ74MABYWZmlum7a0zp0qXFwoULlecAxBdffKE8T0xMFDqdTvz+++8vnVf79u3FRx99ZHTcd999JypUqGCwPFNSUoStra3Ys2ePECL9ezNhwgSjr9+7d68wNzcXkZGRyrDz588LAOLYsWNCiPTvrp2dnUhISFCmGT16tKhXr54QQohbt44IKytLsXr1HBEff1bEx58VEREHhK2tjfj00x4iPv6sWL9+gXBychA3bx5WpsnqkSGr34pX6QVcYyWSXNWqVQ2eFy9eHLGxsTh58iQSExPh6uoKBwcH5REREZHtZk5nZ2dUr14dwcHBOHfuHMzMzPDJJ5/gzJkzePToEYKDg5W11YSEBNy+fRuNGjUymEejRo1w8eJFg2G1a9fO9F7Jycl444030KlTJyxZsuS1LtARHh6Op0+fGmSxtLRE3bp1M2Ux9tru3bujTJkycHJygq+vL4D0zZF56fll5+HhAQCoUqVKpmGxsbEAgJMnT2Lt2rUGy7NVq1bQ6/XKtWxfJ4O9vT0cHR2V98vOp59+io0bN6J69eoYM2YMQkNDlXEnT57E1atX4ejoqOQsWrQonjx5gvDwcMTGxuL27dto0aKF0XlfvHgR3t7e8Pb2VoYFBATAxcXFYFn6+PjA0dFReZ7x3QeAiIgopKY+Rd261ZTxRYs6w8/PR3nerFkDeHsXR7VqbTFgwH+wefNOPH6c/NLP/rp48BKR5CwtLQ2e63Q66PV66PV6FC9eHMHBwZle4+Liku08AwMDERwcDCsrKzRt2hRFihRBpUqVcOjQIQQHB2c6XePFhiiEyDTM3t4+0/tYW1ujZcuW2LlzJ0aPHo2SJUtmmys74v83l+Yky4vat28Pb29vfPvtt/Dy8oJer0flypWVzZZ55flll5HR2LCMTdJ6vR6ffPIJhg0blmlepUqVeu0MGe+Zk03gbdq0wY0bN7Bz50788ccfaNGiBQYPHox58+ZBr9ejVq1a+PHHHzO9zs3N7aVXL8pqmb04PLvsIgc303B0tMf+/Ztw4MAJ/PlnKGbM+C9mzVqOv/7aABcXp5e+PrfYWAsBme9bSLlXs2ZNxMTEwMLCAj4+PkansbKyQlpaWqbhgYGB+O6772BhYYGWLVsCAJo2bYqNGzca7F91cnKCl5cXDh48iCZNmiivDw0NRd26dV+a0czMDOvXr0f37t3RvHlzBAcHw8vr5bf7yrizyPPZ/fz8YGVlhYMHD6J79+4A0o8+PnHihPIPAWOvu3fvHi5evIgVK1agcePGAICDBw++NMOrZFNLzZo1cf78eWVfpNbc3NzQp08f9OnTB40bN8bo0aMxb9481KxZE5s2bVIOmjPGx8cHQUFBysFezwsICEBkZCSioqKUtdYLFy4gPj4e/v7+OcpWpkwpWFpa4Pjxs/D2Lg4AePAgAeHh1/HGG//uR7WwsECzZvXRrFl9jBs3EKVKvYH9+4+hQ4eWr1qOHOOmYKJ8qmXLlmjQoAE6deqEPXv24Pr16wgNDcUXX3yhHGnq4+ODiIgIhIWF4e7du0hJSQEANGnSBI8ePcJvv/2GwMBAAOnN9ocffoCbmxsCAgKU9xk9ejS++uorbNq0Cf/88w/GjRuHsLAwfPbZZznKaW5ujh9//BHVqlVD8+bNERMT89LXlC5dGjqdDjt27EBcXBwSExNhb2+PTz/9FKNHj8bu3btx4cIF9O/fH48fP0a/fv2yfF3GUasrV67E1atX8eeff2LEiNwfGWrsPdQyduxYHD58GIMHD0ZYWBiuXLmC7du3Y+jQoaq9R05NmjQJv/76K65evYrz589jx44dStPr0aMHihUrho4dO+LAgQOIiIhASEgIPvvsM9y8eRNA+lG98+fPx5IlS3DlyhWcOnUKS5cuBZD+3a1atSp69OiBU6dO4dixY+jVqxeaNm1qdJeCMQ4OdujZszMmTVqA4OAjuHDhCgYN+sJgbXn37hB8882POHv2EiIjb+Onn36DXq9HuXI+6hbrBVxjpUItP69963Q67Nq1CxMmTEDfvn0RFxcHT09PNGnSRNl3984772Dr1q1o1qwZHj58iDVr1qBPnz5wdnZGjRo1EBkZqTTRxo0bQ6/XK2urGYYNG4aEhASMHDkSsbGxCAgIwPbt21GuXLkcZ7WwsMBPP/2Ebt26KWuu7u7uWU5fokQJTJ06FePGjcNHH32EXr16Ye3atZg9ezb0ej169uyJR48eoXbt2tizZw+KFCmS7es2btyIYcOGoXLlyqhQoQKWLFmi/IPiVWX1HmqoWrUqQkJCMGHCBDRu3BhCCJQtWzbT0bKmYGVlhfHjx+P69euwtbVF48aNsXHjRgDp9yzdv38/xo4diy5duuDRo0coUaIEWrRooazB9u7dG0+ePMHChQsxatQoFCtWDO+++y6A9O/uL7/8gqFDh6JJkyYwMzND69atlcabU19+ORJJScn44INhcHCwx5AhvZCQ8O8/dJydHfHbb0GYNWs5UlJSUbZsKXz33Vfw98/bLQI6kZMN1YVYQkICnJ2dER8fn+UmD9lxUzDw5MkTREREwNfXN9e3giIieSQknFN1fk5O6QeVZfVb8Sq9gJuCiYiIVMTGSkQmN3DgQINTSp5/DBw4kNmMOHDgQJa5HBwcXnl+sn7OgoCbgl+Cm4Iz46Zgel2xsbFISEgwOs7JySnb/a95TdZsycnJuHXrVpbjX/VIYlk/Z07JvCmYBy8Rkcm5u7tL+8MtazZbW1tVT8OR9XMWBNwUTIUKN9AQUXbU+I1gY6VCwdzcHADy/Eo7RJS/PX78GEDmqz69Cm4KpkLBwsICdnZ2iIuLg6Wl5UsvuUZEcktNVXfrU3JyMh4/fozY2Fi4uLgo/xjPDTZWKhR0Oh2KFy+OiIgI3LhxQ+s4RPSanjx5+Y0EXoWNTfoaqouLCzw9PV9rXmysVGhYWVmhXLly3BxMVAAcPjJA1fk18N8HS0vL11pTzcDGSoWKmZkZT7chKgD0+tuqzk/N3wXuaCIiIlIRGysREZGK2FiJiIhUxMZKRESkIjZWIiIiFbGxEhERqYiNlYiISEVsrERERCpiYyUiIlIRGysREZGK2FiJiIhUxMZKRESkIjZWIiIiFbGxEhERqShfN9b9+/ejffv28PLygk6nwy+//GIwXgiBKVOmwMvLC7a2tggMDMT58+e1CUtERIVCvm6sSUlJqFatGpYtW2Z0/Jw5c7BgwQIsW7YMx48fh6enJ9588008evTIxEmJiKiwyNc3Om/Tpg3atGljdJwQAosWLcKECRPQpUsXAMC6devg4eGBDRs24JNPPjFlVCIiKiTy9RprdiIiIhATE4O33npLGWZtbY2mTZsiNDQ0y9elpKQgISHB4EFERJRTBbaxxsTEAAA8PDwMhnt4eCjjjJk1axacnZ2Vh7e3d57mJCKigqXANtYMOp3O4LkQItOw540fPx7x8fHKIyoqKq8jEhFRAZKv97Fmx9PTE0D6mmvx4sWV4bGxsZnWYp9nbW0Na2vrPM9HREQFU4FdY/X19YWnpyf27dunDEtNTUVISAgaNmyoYTIiIirI8vUaa2JiIq5evao8j4iIQFhYGIoWLYpSpUph+PDhmDlzJsqVK4dy5cph5syZsLOzQ/fu3TVMTUREBVm+bqwnTpxAs2bNlOcjRowAAPTu3Rtr167FmDFjkJycjEGDBuHBgweoV68e9u7dC0dHR60iExFRAZevG2tgYCCEEFmO1+l0mDJlCqZMmWK6UEREVKgV2H2sREREWmBjJSIiUhEbKxERkYrYWImIiFTExkpERKQiNlYiIiIVsbESERGpiI2ViIhIRWysREREKmJjJSIiUhEbKxERkYrYWImIiFTExkpERKQiNlYiIiIVsbESERGpiI2ViIhIRWysREREKrLQOgAREckr6M+yqs2rRfNw1eYlM66xEhERqYiNlYiISEVsrERERCpiYyUiIlIRGysREZGK2FiJiIhUxMZKRESkIjZWIiIiFbGxEhERqYiNlYiISEW8pKGKeOkvIiLiGisREZGK2FiJiIhUxE3BRFngpn0iyg02VtKUms0LYAMjIu1xUzAREZGK2FiJiIhUxMZKRESkIjZWIiIiFbGxEhERqYiNlYiISEVsrERERCpiYyUiIlIRGysREZGK2FiJiIhUxMZKRESkIl4rmCgf4g0CXp3M16Xm8ixYCkVj/frrrzF37lxER0ejUqVKWLRoERo3bqx1LKICR+bmRWQqBX5T8KZNmzB8+HBMmDABp0+fRuPGjdGmTRtERkZqHY2IiAqgAt9YFyxYgH79+uHjjz+Gv78/Fi1aBG9vbyxfvlzraEREVAAV6E3BqampOHnyJMaNG2cw/K233kJoaKjR16SkpCAlJUV5Hh8fDwBISEh46fslJelfI62hnLxfTqmZC2C23FAzFyBvtsKyPAF5s/G7ljsvy5YxXgjx0nkV6MZ69+5dpKWlwcPDw2C4h4cHYmJijL5m1qxZmDp1aqbh3t7eeZIxa84mfr9XwWyvTtZcALPllqzZZM0FFIRsjx49grNz9tMW6MaaQafTGTwXQmQalmH8+PEYMWKE8lyv1+P+/ftwdXXN8jU5lZCQAG9vb0RFRcHJyem15qU2ZssdWbPJmgtgttySNZusuQB1swkh8OjRI3h5eb102gLdWIsVKwZzc/NMa6exsbGZ1mIzWFtbw9ra2mCYi4uLqrmcnJyk+wJmYLbckTWbrLkAZsstWbPJmgtQL9vL1lQzFOiDl6ysrFCrVi3s27fPYPi+ffvQsGFDjVIREVFBVqDXWAFgxIgR6NmzJ2rXro0GDRpg5cqViIyMxMCBA7WORkREBVCBb6zdunXDvXv3MG3aNERHR6Ny5crYtWsXSpcubfIs1tbWmDx5cqZNzTJgttyRNZusuQBmyy1Zs8maC9Aum07k5NhhIiIiypECvY+ViIjI1NhYiYiIVMTGSkREpCI2ViIiIhWxsRIREamIjZWklJqamuW4u3fvmjBJZjJnIyLtsbGaQFRUVJbjjhw5YsIkhmTNBQBdu3aFXp/57hV37txBYGCg6QM9R+ZsMi9TWbFmuRMUFJTluGXLlpkwiSEpcgnKcxUqVBB3797NNPzgwYPC2dnZ9IH+n6y5hBCibt26ok+fPgbDoqOjRcWKFcU777yjUap0MmeTeZl+//33omHDhqJ48eLi+vXrQgghFi5cKH755RdNc8lcMyHkrZuzs7M4duxYpuELFy4Ujo6OGiRKJ0MuNlYT+Pjjj0XNmjVFQkKCMiwkJEQ4OTmJBQsWMJcRd+/eFQEBAWL48OFCCCFu3rwpypcvL9577z2RlpbGbFmQdZl+/fXXolixYmL69OnC1tZWhIeHCyGEWLNmjQgMDNQslxDy1kwIueu2evVqUaxYMXH+/Hll2Ny5c4WTk5PYv39/oc7FxmoCer1evPPOO6Jx48YiOTlZ/Pnnn8LBwUEsWrSIubIRFRUlSpcuLYYPHy7KlSsnunXrJp49e6Z1LCGEvNlkXab+/v5i27ZtQgghHBwclAZx7tw54erqqmEyeWsmhNx1EyK9YZUoUUJERESI2bNnCycnJ3Ho0CGtY2mei43VRFJTU8Wbb74pGjZsKBwcHMTSpUu1jiSEkDdXhsuXLwt3d3fRo0cPodfrtY5jQNZsMi5TGxsbZTPm8w3i8uXLwsbGRstoQgg5ayaE/HUTQohx48YJV1dX4eLiIo4cOaJ1HIWWuQr8Rfi1cvbs2UzDJk+ejA8++AAffvghmjRpokxTtWrVQp8LAIoUKWL0ZvKPHz/Gb7/9BldXV2XY/fv3TRlN6mwyL9MMvr6+CAsLy3Tzi99//x0BAQEmz5MfagbIV7clS5ZkGla8eHHY2dmhSZMmOHr0KI4ePQoAGDZsWKHNxYvw5xEzMzPodDo8X97nn2f8v06nQ1paWqHPBQDr1q3L8bS9e/fOwySZyZxN5mWaYc2aNZg4cSLmz5+Pfv36YdWqVQgPD8esWbOwatUqvP/++ybNkx9qBshXN19f3xxNp9PpcO3atTxO8y/ZcrGx5pEbN27keFpT3sJO1lzPe/bsGX788Ue0atUKnp6emmTIiozZ8sMyBYBvv/0W06dPV05vKVGiBKZMmYJ+/fqZPEt+qRkgV90oh0y64bkQSk1NFX369FH2jchC1lwZbG1tlX1LspE1m+zLNENcXJy4c+eO1jGEEPmnZkLIVzdfX1+DI29lIEsuXiAij1laWmLbtm1ax8hE1lwZ6tWrh9OnT2sdwyhZs8m+TDMUK1YM7u7uWscAkH9qBshXt5SUFKPHHWhJllxsrCbQuXNn/PLLL1rHyETWXAAwaNAgjBw5EsuWLcPhw4dx9uxZgwezGSfrMr1z5w569uwJLy8vWFhYwNzc3OChJVlrBshdt6FDh+Krr77Cs2fPNM3xIhlycR+rCcyYMQPz5s1DixYtUKtWLdjb2xuMN+XRc/khF5B+cMmLZDmgROZssi7TNm3aIDIyEkOGDEHx4sUzrVF07NhRk1yAvDUD5K5b586dERQUBAcHB1SpUiVT3bZu3Vpoc7GxmkB2R6yZ+ui558maC3j5wSVaHlAiczZZl6mjoyMOHDiA6tWra/L+2ZG1ZoDcdfvoo4+yHb9mzRoTJTEkQy42ViLKcwEBAfjxxx9Ro0YNraPkK6xb/sTGSlK7cOECIiMjM92qrUOHDhol+pfM2WSzd+9ezJ8/HytWrICPj4/WcfIN1i1/YmM1kZs3b2L79u1Gf4gXLFigUSp5c127dg2dO3fGuXPnMp24D0DT/ZgyZwPkWaYvXq0qKSkJz549g52dHSwtLQ2mNfXVql4kS82A/FW3n3/+GZs3bzZat1OnTmmUSvtcvKShCQQFBaFDhw7w9fXFP//8g8qVK+P69esQQqBmzZrMZcRnn30GX19f/PHHHyhTpgyOHTuGe/fuYeTIkZg3bx6zZUGmZbpo0SKTvl9uyVQzIP/UbcmSJZgwYQJ69+6NX3/9FR999BHCw8Nx/PhxDB48uHDnMvWJs4VRnTp1xMSJE4UQ/15I+9GjR6JDhw7i66+/Zi4jXF1dxZkzZ4QQQjg5OYlLly4JIYQICgoS1atX1zKa1NlkXqayYs1yp0KFCmLDhg1CCMMbBEycOFEMHjy4UOdiYzUBBwcHcfXqVSGEEC4uLuLvv/8WQggRFhYmSpcuzVxGuLi4KH8QZcqUEX/++acQQoirV68KW1tbLaNJnU3WZbpz506xe/fuTMP37Nkjdu3apUGif8laMyHkrtvzVyBzc3MTYWFhQoj0O+8ULVq0UOfiBSJMwN7eHikpKQAALy8vhIeHK+Pu3r2rVSxpcwFA5cqVlYst1KtXD3PmzMGhQ4cwbdo0lClThtmyIOsyHTdunNF9z3q9HuPGjdMg0b9krRkgd908PT1x7949AOmnmB05cgQAEBERYXBzg8KYi/tYTaB+/fo4dOgQAgIC0K5dO4wcORLnzp3D1q1bUb9+feYy4osvvkBSUhIAYPr06Xj77bfRuHFjuLq6YtOmTcyWBVmX6ZUrV4ze5qxixYq4evWqBon+JWvNALnr1rx5c/z222+oWbMm+vXrh88//xw///wzTpw4gS5duhTuXCZZLy7kwsPDlX1ySUlJ4tNPPxVVqlQRnTt31vRi7rLmysq9e/ekuqH482TJJusy9fDwEEFBQZmG79u3T7i5uWmQ6F+y1kwIueuWlpYmnj59qjzftGmTGDp0qFi8eLFISUkp1Ll4ug0R5bkBAwbgyJEj2LZtG8qWLQsAuHr1Kt555x3UqVMHq1at0jihnFi3/ImN1cQSExOh1+sNhjk5OWmU5l+y5Xry5AmWLl2Kv/76C7GxsZmyaXmOnMzZnifTMo2Pj0fr1q1x4sQJlCxZEkD6uaONGzfG1q1b4eLiokmuF8lUM0D+uj158gRnz541+neg5YVStM7FfawmEBERgSFDhiA4OBhPnjxRhguNL9ouay4A6Nu3L/bt24d3330XdevW1fw2UM+TOZusy9TZ2RmhoaHYt28fzpw5A1tbW1StWhVNmjTRJM/zZK0ZIHfddu/ejV69ehk9wEvLusmQi2usJtCwYUMA6RcW8PDwyPRD3LRpUy1iSZsLSP9B2bVrFxo1aqRZhqzInE3mZSor1ix3/Pz80KpVK0yaNAkeHh5ax1HIkItrrCZw9uxZnDx5EhUqVNA6igFZcwFAiRIl4OjoqHUMo2TOJvMyTUpKQkhIiNHLzGl5azaZawbIW7fY2FiMGDFCqqYKSJLLJIdIFXKBgYFi3759WsfIRNZcQgixa9cu0bp1a82PyjRG5myyLtNTp04JT09P4eTkJMzNzYWbm5vQ6XTC3t5e+Pr6appN1poJIXfdPvroI7Fq1SpNMxgjQy5uCjaB8PBwDBw4EB9++CEqV66c6ULaVatWZa4XxMXFoWvXrti/f790Fx+XOZusyzQwMBDly5fH8uXL4eLigjNnzsDS0hIffvghPvvsM03Pe5S1ZoDcdXv8+DHee+89uLm5oUqVKpnqptXatAy52FhN4MiRI+jevTuuX7+uDMu4K4qWO/llzQUALVu2RGRkJPr162d0v1fv3r01SiZ3NlmXqYuLC44ePYoKFSrAxcUFhw8fhr+/P44ePYrevXvj0qVLmuQC5K0ZIHfdVq1ahYEDB8LW1haurq4Gfwda3iBehlzcx2oCffv2RY0aNfDTTz8Z/SHWiqy5ACA0NBSHDx9GtWrVtI6SiczZZF2mlpaWShYPDw9ERkbC398fzs7OiIyM1DSbrDUD5K7bF198gWnTpmHcuHEwM5Pn6rgy5GJjNYEbN25g+/bt8PPz0zqKAVlzAemXbEtOTtY6hlEyZ5N1mdaoUQMnTpxA+fLl0axZM0yaNAl3797F+vXrUaVKFU2zyVozQO66paamolu3blI1VUCOXHJVpIBq3rw5zpw5o3WMTGTNBQCzZ8/GyJEjERwcjHv37iEhIcHgwWzGybpMZ86cieLFiwMAvvzyS7i6uuLTTz9FbGwsVq5cqWk2WWsGyF233r17a35tbGNkyMV9rCawcuVKTJ8+HX379jW6M12rK5TImguA8q/NFzfLybDfS+ZsMi9TWbFmuTNs2DB8//33qFatGqpWrZqpbgsWLCi0udhYTSC7TRJa/hDLmgsAQkJCsh2v5Un7MmeTbZkmJydj3759aNasWaZzfxMSEhAcHIxWrVrB2trapLmeJ1vNgPxRt2bNmmU5TqfT4c8//zRhmn/JkIuNlYjyzOLFi7F9+3YEBQUZHd+yZUt07twZgwcPNnEyubFu+RsbK0nr4cOHOHbsmNELaffq1UujVOlkziaTunXrYuLEiWjfvr3R8Tt27MC0adNw7NgxEyeTG+uWv7GxmkhQUBCCgoKM/hCvXr1ao1Ty5vrtt9/Qo0cPJCUlwdHRMdO5aFpehEHmbIBcy7RIkSI4c+YMSpUqZXR8ZGQkqlWrhgcPHpg014tkqhmQP+qWlJSE2bNnZ1k3rc5jlSEXT7cxgalTp2LatGmoXbs2ihcvLs15crLmAoCRI0eib9++mDlzJuzs7LSOY0DmbLIt02fPniEuLi7LBhEXF4dnz56ZOJUh2WoG5I+6ffzxxwgJCUHPnj2lqRsgSS7TXkGxcPL09BTff/+91jEykTWXEELY2dmJ8PBwrWMYJXM22ZZpvXr1xOzZs7McP2vWLFGvXj0TJspMtpoJkT/q5uzsLA4ePKhpBmNkyMXzWE0gNTVVuTWVTGTNBQCtWrXCiRMntI5hlMzZZFumffv2xZdffokdO3ZkGvfbb78pp7loSbaaAfmjbkWKFEHRokU1zWCMDLm4j9UExo4dCwcHB0ycOFHrKAZky7V9+3bl/+Pi4jBt2jR89NFHUpxbKHO258m2TAHgww8/xIYNG1CxYkVUqFABOp0OFy9exOXLl9G1a1f89NNPmuaTsWaA/HX74Ycf8Ouvv2LdunVS7RKRIRcbax4ZMWKE8v96vR7r1q1D1apVNT+RWtZcQPbnEz5Pi3MLZc4m8zLNsHnzZmzYsAFXrlyBEALly5dH9+7d0bVrV03y5IeaAfLVrUaNGgb7LK9evQohBHx8fDLV7dSpU4U2FxtrHsnuJOXnmfpEallzUe5xmb461ix3pk6dmuNpJ0+enIdJDMmWi42ViExCr9fj6tWrRk+BaNKkiUap5Me65T883cYE4uPjkZaWlmmH+v3792FhYQEnJyfmesGwYcPg5+eX6abEy5Ytw9WrV7Fo0SJtgkHubLIu04x7nt64cQMv/lte68tnylozQO66HT9+HHq9HvXq1TMYfvToUZibm6N27dqFNhePCjaB999/Hxs3bsw0fPPmzXj//fc1SJRO1lwAsGXLFjRq1CjT8IYNG+Lnn3/WING/ZM4m6zIdOHAgateujb///hv379/HgwcPlIfWF9SQtWaA3HUbPHgwoqKiMg2/deuWppdalCKXFuf4FDZFihQRFy5cyDT84sWLomjRohokSidrLiGEsLa2FleuXMk0/MqVK8La2lqDRP+SOZusy9TOzs5ozWQga82EkLtu9vb2Rs/nvnbtmnBwcNAgUToZcnGN1QRSUlKMXiXl6dOnmt4wW9ZcAODn54fdu3dnGv7777+jTJkyGiT6l8zZZF2m9erVw9WrVzV7/+zIWjNA7rpZW1vjzp07mYZHR0fDwkK7vYwy5OI+VhOoU6cOVq5ciaVLlxoM/+abb1CrVi2NUsmbC0g/HWLIkCGIi4tD8+bNAaRfz3X+/Pma7sOUPZtMy/Ts2bPK/w8dOhQjR45ETEyM0XN/q1atatJsz5OpZkD+qdubb76J8ePH49dff4WzszOA9JtT/Oc//8Gbb75ZqHPxqGATOHToEFq2bIk6deqgRYsWANJ/iI8fP469e/eicePGzGXE8uXLMWPGDNy+fRsA4OPjgylTpkhx9xhZs8m0TM3MzKDT6TIddJMhY5zWB+HIVDMg/9Tt1q1baNKkCe7du4caNWoAAMLCwuDh4YF9+/bB29u70OZiYzWRsLAwzJ07F2FhYbC1tUXVqlUxfvx4lCtXjrleIi4uDra2tnBwcNA6SiYyZpNlmd64cSPH05YuXToPk7ycLDUD8lfdkpKS8OOPP+LMmTNK3T744INMa9aFLRcbKxHluf3796Nhw4aZ9nE9e/YMoaGhPB8zC6xb/sTGaiKynuQta647d+5g1KhRyj0VX/yaarkJTOZsgJzL1NzcHNHR0XB3dzcYfu/ePbi7u7NmWZC9bpcvX0ZwcLDRuk2aNEmjVNrn4sFLJiDrSd6y5gKAPn36IDIyEhMnTpTqXo+A3NlkXaYZ+wRfdO/ePdjb22uQ6F+y1gyQu27ffvstPv30UxQrVgyenp4GOXU6nWaNVYZcXGM1gerVq6N8+fKYOnWq0R/ijCPXmOtfjo6OOHDgAKpXr65ZhqzInE22ZdqlSxcAwK+//orWrVvD2tpaGZeWloazZ8+iQoUKRk9fMhXZagbkj7qVLl0agwYNwtixYzXLYIwMubjGagJXrlzBzz//DD8/P62jGJA1FwB4e3tneVSk1mTOJtsyzWhKQgg4OjrC1tZWGWdlZYX69eujf//+WsUDIF/NgPxRtwcPHuC9997TNIMxUuQyyWUoCrlmzZqJ33//XesYmciaSwgh9uzZI9566y0RERGhdZRMZM4m6zKdMmWKSExM1DqGUbLWTAi569a3b1+xfPlyrWNkIkMurrGagKwnecuaCwC6deuGx48fo2zZsrCzs8uUTcvrpMqcTdZlaspbiL0qWWsGyF03Pz8/TJw4EUeOHDFatxdvUlGYcnEfqwkYu0m2DCd5y5oLANatW5ft+N69e5soSWYyZ5NpmdasWRNBQUEoUqRIphtRv8iUN8V+kUw1A/JP3Xx9fbMcp9PpcO3aNROm+ZcMubjGagIRERFaRzBK1lyAts3pZWTOJtMy7dixo3LQTceOHaU6evp5MtUMYN1elwy5uMZK0goPD8eaNWsQHh6OxYsXw93dHbt374a3tzcqVarEbEQSSE1NRUREBMqWLavpxfdfpGUu3t3GRNavX49GjRrBy8tLuWTZokWL8OuvvzKXESEhIahSpQqOHj2KrVu3IjExEUD6Bcq13u8kczZArmVaokQJ9OzZE2vWrJFiTSIrMtUMyB91e/z4Mfr16wc7OztUqlQJkZGRANL3Yc6ePbtQ52JjNYHly5djxIgRaNu2LR4+fKjss3FxcdH0biiy5gKAcePGYfr06di3bx+srKyU4c2aNcPhw4c1TCZ3NtmW6cCBAxEdHY0hQ4bAz88PPj4+6Nu3L9avX4+bN2+aPI8xstUMyB91Gz9+PM6cOYPg4GDY2Ngow1u2bIlNmzYV7lzaHZBcePj7+4tt27YJIYRwcHBQbsJ77tw54erqylxG2Nvbi2vXrgkhDLNFRERofjNxmbPJukxTU1NFSEiImDp1qmjevLmwtbUVZmZmws/PTwwYMECzXELIWzMh5K5bqVKlxOHDh4UQhnW7cuWKcHR0LNS5uMZqAhEREcrti55nbW2NpKQkDRKlkzUXkL62EB0dnWn46dOnUaJECQ0S/UvmbLIuU0tLSzRp0gSTJk1CUFAQbt26hfHjxyM2NharVq3SLBcgb80AuesWFxeX6RrGQPqdZbQ84EqGXGysJuDr64uwsLBMw3///XcEBASYPtD/kzUXAHTv3h1jx45FTEwMdDod9Ho9Dh06hFGjRml+z1OZs8m6TJ88eYKgoCBMnDgRjRs3RvHixfHzzz+jW7du+P777zXLBchbM0DuutWpUwc7d+5Unmc0rW+//RYNGjTQKpYcuUyyXlzIrV69WpQoUUJs3LhR2Nvbi59++klMnz5d+X/myiw1NVV0795dmJmZCZ1OJywtLYWZmZn48MMPxbNnz5gtC7It00mTJonGjRsLGxsbERAQID799FOxceNGER0dbfIsWZGtZkLkj7odOnRIODo6ioEDBwobGxvx2WefiZYtWwp7e3tx4sSJQp2LjdVEVq5cKUqVKiV0Op3Q6XSiZMmSYtWqVVrHkjZXhvDwcPG///1PbNq0SVy+fFnrOAZkzSbTMtXpdKJ06dJi+fLl4u7du5pkyAmZaiZE/qnb2bNnRa9evUSlSpWEv7+/6NGjhzh79qzWsTTPxfNYTezu3bvQ6/VG9wFoSdZclHsyLNPdu3cjODgYwcHBOH36NMqXL4/AwEA0bdoUTZs2hZubm2bZjJGhZkD+qxsZYmPVQGpqKlJTU+Hg4KB1FAOy5Lpy5QrOnj2LmjVrwtfXFzt37sRXX32F5ORkdOrUCf/5z380OzhC5mzGyLJMAeDRo0c4cOAAQkJC8Ndff+HMmTPw8/NDs2bNsGzZMq3jKWSqGZA/6iaEwF9//YXk5GQ0bNgQRYoU0ToSAA1zmWzduJBavXq1GDJkiPjhhx+EEEKMGzdOWFlZCTMzM9GyZUvNNvPImmvr1q3CwsJCWFlZCWtra7Fu3TphbW0tWrduLdq1aycsLCzE7Nmzmc0IWZfpi549eyZCQ0PFuHHjhJOTkzAzM9MsS36pmRDy1O3BgweiV69eonLlyuLjjz8W8fHxolGjRspmdHd3d3HmzJlCnYuNNQ9Nnz5d2NraihYtWoiiRYuKgQMHCk9PTzF79mwxZ84cUbJkSTFw4EDmek6tWrXEf/7zH6HX68Xq1auFra2tWLhwoTJ+xYoVomLFisz2ApmXaVpamjh69KiYPXu2aN26tXB0dBRmZmaiVKlSonfv3mLt2rWa5JK5ZkLIW7d+/fqJcuXKiS+//FLUq1dPNGjQQNSvX18cOXJEHDt2TAQGBoq33367UOdiY81Dfn5+YsOGDUIIIY4fPy7MzMzE//73P2X8rl27RKlSpZjrOQ4ODuLq1atCiPQfFnNzc3Hu3DllfEREhLC1tWW2F8i6TNu0aSOcnJyETqcTJUqUED169BCrVq1STtrXkqw1E0Luunl5eYng4GAhhBA3b94UOp1O/PXXX8r4o0ePCg8Pj0Kdi401D1lZWYnIyEiD55cuXVKe37x5U1haWjLXc3Q6nbhz547y/PkrpwghRExMjGabwGTOJusyff/998WKFSukOmo6g6w1E0Luupmbm4vbt28rz21tbZV/cAohRHR0tCZ/BzLlkudWBAXQ06dPlds/AYCVlZXBTXctLCw0ueeprLmA9JO5nz/458XnWpI5m6zL9KeffgIAREVFZTnNkSNHUL9+fVNFUshaM0Duuun1epibmyvPzc3NM/1daEGmXGyseezChQuIiYkBkH6E2qVLl5S7ody9e5e5XiCEQPny5ZU/gsTERNSoUUO5GbXQ8CB2mbMB8i5TAHjzzTdx6NAhuLq6Ggw/dOgQ2rVrh4cPH2qSS+aaAfLWbdWqVcpR08+ePcPatWtRrFgxAOlHMWtFllw83SYPmZmZQafTGf3BzRiu0+lM/q9iWXMBwLp163I0nRY3G5c5m8zLFAD69++PU6dOITg4GI6OjgCA/fv3o3379pgyZQo+//xzk2eSvWaAnHXz8fHJ0dqfqW93J1MuNtY8lHFfx5cpXbp0HicxJGsuyj3Zl6kQAu+99x5iY2Oxd+9eHD58GB06dMD06dPx2WefaZJJ9poBctaNXo6NlYhM4unTp2jXrh2SkpJw9uxZzJo1C0OGDNE6lvRYt/yHjTWPnD17NsfTVq1aNQ+TGJI1FwAUKVIkxwcY3L9/P4/TGJI5m6zL1FiuR48e4YMPPkC7du3w6aefapILkLdmgNx1W7JkSY6nHTZsWB4mMSRbLjbWPPL8/puX/SCbch+OrLkAw32Y9+7dw/Tp09GqVSvlVk+HDx/Gnj17MHHiRJPvW5I5m6zL1Ng+zOefy3KcgUw1A+Sum6+vr8HzuLg4PH78GC4uLgCAhw8fws7ODu7u7rh27VrhzZWX5/IUZtevX1ce27ZtE2XLlhXffPONOHPmjDhz5oz45ptvRLly5cS2bduYy4guXbqIpUuXZhq+dOlS0bFjR9MHeo5s2WRdps/netnD1GSt2YvZZKvb83788UfRqFEjg3N/L126JBo3bqxcIrKw5mJjNYE6deqInTt3Zhq+c+dOUbNmTQ0SpZM1lxBC2NvbiytXrmQafvnyZWFvb69Bon/JnE3GZZqamir69OkjxVWDjJGxZkLIX7cyZcqIU6dOZRp+4sQJ4ePjo0GidDLkMsv7dWI6d+5cpk0VQPrmiwsXLmiQKJ2suQDA1dUV27ZtyzT8l19+yXROn6nJnE3GZWppaWm0XrKQsWaA/HWLjo7G06dPMw1PS0vDnTt3NEiUTopcJmnfhVyNGjVE9+7dRXJysjLsyZMnonv37qJGjRrMZcSaNWuEmZmZaNu2rfjyyy/Fl19+Kdq1ayfMzc3FmjVrmC0Lsi7TPn36iPnz52v2/tmRtWZCyF23t99+W1StWlUcP35c6PV6IUT6NZerV68u2rdvX6hz8eAlEzh27Bjat28PvV6PatWqAQDOnDkDnU6HHTt2oG7dusxlxNGjR7FkyRJcvHgRQggEBARg2LBhqFevnqa5ZM4m6zKdMWMG5s2bhxYtWqBWrVqwt7c3GG/KI0hfJGvNALnrFhcXh969e2P37t3KpSCfPXuGVq1aYe3atZrdLF6GXGysJvL48WP88MMPuHTpkvJD3L1790x/KMxFr0vGZWpsU2sGnU5n0iNIjZGxZoD8dQOAy5cvK3Xz9/dH+fLltY4EQNtcbKwkveTk5Ez7TJycnDRKY0jmbESkDV6E34QuXLiAyMhIpKamGgzv0KGDRonSyZjr8ePHGDNmDDZv3ox79+5lGq/l9VtlzpZBxmUqO9bs1d28eRPbt283WrcFCxZolEr7XGysJnDt2jV07twZ586dy3SiN6DdD7GsuQBg9OjR+Ouvv/D111+jV69e+O9//4tbt25hxYoVmD17tma5ZM8m8zLV+scuKzLXDJC3bkFBQejQoQN8fX3xzz//oHLlyrh+/TqEEKhZs2bhzmWSQ6QKubffflt07NhRxMbGCgcHB3HhwgVx4MABUbduXbF//37mMsLb21v89ddfQgghHB0dlfNGv//+e9GmTRsNk8mdTdZl+scffwg7OztRqVIlYWFhIapXry5cXFyEs7OzaNasmWa5hJC3ZkLIXbc6deqIiRMnCiGEcHBwEOHh4eLRo0eiQ4cO4uuvvy7UudhYTcDV1VWcOXNGCCGEk5OTckWQoKAgUb16deYywt7eXrmyTIkSJcTRo0eFEEJcu3ZN84swyJxN1mUqw49dVmStmRBy183BwUFcvXpVCCGEi4uL+Pvvv4UQQoSFhYnSpUsX6ly8QIQJpKWlKTffLVasGG7fvg0g/XZU//zzD3MZUaZMGVy/fh0AEBAQgM2bNwMAfvvtN+X6n1qROZusy/TixYvKfWotLCyQnJwMBwcHTJs2DV999ZVmuQB5awbIXTd7e3ukpKQAALy8vBAeHq6M0/Im8TLk4j5WE6hcuTLOnj2LMmXKoF69epgzZw6srKywcuVKlClThrmM+Oijj3DmzBk0bdoU48ePR7t27bB06VI8e/ZM0/1KsmeTdZka+7GrVKkSAG1/hAF5awbIXbf69evj0KFDCAgIQLt27TBy5EicO3cOW7duRf369Qt3LpOsFxdyu3fvFlu2bBFCCBEeHi78/f2FTqcTxYoVE0FBQcyVAzdu3BBbtmwRYWFhWkfJRKZssi7Tjh07ipUrVwohhBg9erTw8/MT06dPFzVr1hQtWrTQLJcQ8tZMCLnrFh4ermxCT0pKEp9++qmoUqWK6Ny5s6Y3CJAhF89j1cj9+/df6R6fpiJjridPnsDGxkbrGEbJnC2DDMv02rVrSExMRNWqVfH48WOMGjUKBw8ehJ+fHxYuXIjSpUtrls0YGWoG5L+6UTo2VhO6evUqwsPD0aRJE9ja2uboXpCFNVdaWhpmzpyJb775Bnfu3MHly5dRpkwZTJw4ET4+PujXrx+zZUPGZSo71uzVPXz4ED///DPCw8MxevRoFC1aFKdOnYKHhwdKlChReHOZZL24kLt7965o3ry50Ol0wszMTLkNVN++fcWIESOYy4ipU6eKMmXKiB9++EHY2toq2TZt2iTq16/PbFmQeZlmePTokYiPjzd4aCk/1EwI+ep25swZ4ebmJvz8/ISFhYVSty+++EL07NmzUOfiUcEm8Pnnn8PS0hKRkZGws7NThnfr1g27d+9mLiO+//57rFy5Ej169IC5ubkyvGrVqrh06ZKGyeTOJusyjYiIQLt27WBvbw9nZ2cUKVIERYoUgYuLC4oUKaJZLkDemgFy123EiBHo06cPrly5YrA7pE2bNti/f3+hzsWjgk1g79692LNnD0qWLGkwvFy5crhx44ZGqeTNBQC3bt2Cn59fpuF6vd7ovRZNSeZssi7THj16AABWr14NDw8PqTaxylozQO66HT9+HCtWrMg0vESJEoiJidEgUToZcrGxmkBSUpLBv4Qz3L17F9bW1hokSidrLgCoVKkSDhw4kOngjP/973+oUaOGRqnSyZxN1mV69uxZnDx5EhUqVNAsQ1ZkrRkgd91sbGyQkJCQafg///wDNzc3DRKlkyEXNwWbQJMmTfD9998rz3U6HfR6PebOnYtmzZoxlxGTJ0/GkCFD8NVXX0Gv12Pr1q3o378/Zs6ciUmTJjFbFmRdpnXq1EFUVJRm758dWWsGyF23jh07Ytq0acpWGp1Oh8jISIwbNw7vvPNO4c5lkj25hdz58+eFm5ubaN26tbCyshLvvvuu8Pf3Fx4eHsqlt5grs927d4smTZoIe3t7YWtrKxo1aiT27NmjdSwhhLzZZF2mV69eFS1bthRr164VJ06cEGfOnDF4aEnWmgkhd93i4+NFo0aNhIuLizA3Nxfe3t7C0tJSNG7cWCQmJhbqXDzdxkRizEqdVgAAVmpJREFUYmKwfPlynDx5Enq9HjVr1sTgwYNRvHhx5npFx48fR506dbSOYZQM2WRcpkeOHEH37t2VS0ECUO4ko9PpNL+DjIw1A+SvGwD8+eefOHXqlFK3li1bah0JgMa5TNK+yajk5GQxd+5crWNkIkOuR48eicePHxsMO336tHj77beFmZmZRqnSyZwtK1ovU39/f9GlSxdx5MgRERERIa5fv27wkJHWNRMif9bt5MmTol27dlrHyMSUudhY81hcXJzYsWOH2LNnj3j27JkQQojU1FSxaNEi4eHhIVxdXZnrOVFRUaJhw4bCzMxMWFpais8//1wkJSWJnj17CgsLC/HOO++I0NBQZjNC1mUqhBB2dnbK7fVkInPNhJC3bnv37hWjRo0S48ePV84TvXjxoujYsaMwMzMTrVq1KtS52Fjz0KFDh4SLi4ty4nndunXF+fPnRbly5UTZsmXF0qVLRVJSEnM9p0ePHqJq1api6dKlIjAwUJiZmYmaNWuKjz76SFy7dk2TTPkhm8zLVIj0e57+/PPPmr2/MbLXTAg567Z27Vqh0+mEq6ur0Ol0ws3NTaxfv144OjqKPn36iHPnzhX6XGyseah58+aiW7du4ty5c+Lzzz8XOp1O+Pr6inXr1gm9Xs9cRnh5eYmDBw8KIYSIjo4WOp1OzJo1S9NMGWTOJvMyFUKIFStWCG9vbzF58mTx888/i19//dXgoQXZayaEnHWrVq2a8r3ftGmT0Ol0ombNmpof6CVTLjbWPOTq6qrcZDcpKUmYmZmJzZs3a5xK3lxCCGFmZiaio6OV53Z2duLChQsaJvqXzNlkXqZCCKHT6bJ8aLVfWvaaCSFn3RwcHJQtNGlpacLCwkIEBwdrkuV5MuXiBSLy0P3795UTku3s7GBnZ6f5BQQAeXNleP4ygWZmZlLdPUbWbLIvU71er3WETGSvGSBn3ZKSkmBvbw/g378Bb29vjVPJlYuNNQ/pdDo8evQINjY2yuHxjx8/znRVECcnJ+b6f0IItGjRAhYW6V/N5ORktG/fHlZWVgbTnTp1itmeI/MylRVrlnt79uyBs7MzgPTmHxQUhL///ttgmg4dOhTaXDyPNQ+ZmZkZXNtTvHAbKqHRuWiy5gKAqVOn5mi6yZMn53GSzGTOJvMyzRAUFISgoCDExsZmWhNbvXq1yfPkh5oBctbtZbT6XXsZU+XiGmse+uuvv7SOYJSsuQBtmlJOyZxN5mUKpP+jZNq0aahduzaKFy8uxcXkZa8ZIGfdZNw8DciVi2usJK1nz54hODgY4eHh6N69OxwdHXH79m04OTnBwcGB2fKR4sWLY86cOejZs6fWUfIV1i1/4kX4TSQ8PBxffPEFPvjgA8TGxgIAdu/ejfPnzzOXETdu3ECVKlXQsWNHDB48GHFxcQCAOXPmYNSoUcyWDRmXaWpqKho2bKjZ+7+MjDUD5K/b+vXr0ahRI3h5eSm32Fu4cCF+/fXXQp2LjdUEQkJCUKVKFRw9ehRbt25FYmIigPRbQmm5eVHWXADw2WefoXbt2njw4AFsbW2V4Z07d0ZQUJCGyeTOJusy/fjjj7FhwwbN3j87stYMkLtuy5cvx4gRI9C2bVs8fPhQ2XdZpEgRLFq0qFDn4qZgE2jQoAHee+89jBgxAo6Ojjhz5gzKlCmD48ePo1OnTrh16xZzvaBYsWI4dOgQKlSoYJDt+vXrCAgIwOPHj5nNCJmW6YgRI5T/1+v1WLduHapWrYqqVavC0tLSYNoFCxaYLNeLZKoZkH/qFhAQgJkzZ6JTp04Gdfv7778RGBiIu3fvFtpcPHjJBM6dO2f0X51ubm64d++eBonSyZoLSP9BMXb03s2bN+Ho6KhBon/JnE2mZXr69GmD59WrVweATKc/aH1Ajkw1A/JP3SIiIoye92ttbY2kpCQNEqWTIRcbqwm4uLggOjoavr6+BsNPnz6NEiVKaJRK3lwA8Oabb2LRokVYuXIlgPQfkcTEREyePBlt27ZltizItEzzw1G3gFw1A/JP3Xx9fREWFobSpUsbDP/9998REBCgUSpJcpn2Qk+F0+jRo8Ubb7whoqOjhaOjo7hy5Yo4ePCgKFOmjJgyZQpzGXHr1i1Rvnx54e/vLywsLET9+vWFq6urqFChgrhz5w6zZUHWZfrw4UNx7969TMPv3bsn4uPjNUj0L1lrJoTcdVu9erUoUaKE2Lhxo7C3txc//fSTmD59uvL/hTkXG6sJpKamiu7duwszMzOh0+mEpaWlMDMzEx9++KFyqyrmyuzx48fiu+++E4MHDxaffvqp+PbbbzPdB1UrsmaTdZm2bt1a/Pe//800fPny5aJNmzYaJPqXrDUTQu66CSHEypUrRalSpZTrF5csWVKsWrVK61ia5+LBSyYUHh6O06dPQ6/Xo0aNGihXrpzWkQDIm4tyT7ZlWrRoURw6dAj+/v4Gwy9duoRGjRppvk8fkK9mQP6oGwDcvXsXer0e7u7uWkcxoFUu7mM1obJly6Js2bJax8hEllzbt2/P8bSmvg6pzNmMkWWZZkhJScGzZ88yDX/69CmSk5M1SJSZbDUD8kfdgPQj5WWkVS6useaR5w+ZfxlTHjIvay4gZ9f6BOS9DimgTTaZl2mGwMBAVKlSBUuXLjUYPnjwYJw9exYHDhwwaZ78UDNAvrrVqFEjx0cjm/JmFLLl4hprHnnxkPmsmPqQeVlzAXJd6/NFMmeTeZlmmDFjBlq2bIkzZ86gRYsWANIvLn/8+HHs3bvX5HnyQ80A+erWqVMnk79nTsiWi2usRGQSYWFhmDt3LsLCwmBra4uqVati/PjxUuzLlBnrlv+wsZI0lixZggEDBsDGxgZLlizJdtphw4aZKFU6mbMRkVzYWPNIly5dsHbtWjg5OaFLly7ZTrt161YTpZI3F5B+YveJEyfg6uqa6WT95+l0Oly7ds2EyeTOJvMyfZ5er8fVq1eN3le0SZMmJs2SX2oGyFW3okWL4vLlyyhWrBiKFCmS7aby+/fvF9pc3MeaR5ydnZWFm3FHexnImgtIvxRZxg9HRESExmkMyZxN5mWa4ciRI+jevTtu3LiBF/8tr8UBX/mhZoB8dVu4cKFy2U4tL7T/IulymeyM2UIoKChIPH36VOsYmciaSwghzMzMDK5eNGrUKKNXntGCzNlkXqZCCFGtWjXx3nvviQsXLogHDx6Ihw8fGjy0IHvNhJCzbhMnThRJSUnK8/v372uS40Uy5WJjzUMv/hDXq1dP3Lx5U8NE6WTNJYQQOp3OIJujo6MIDw/XMNG/ZM4m8zIVQgg7Oztx5coVrWMYkL1mQuSPusnydyBTLt6PNQ+JFzbdnD9/HikpKRql+ZesuYx5MatMZMom+zKtV68erl69qnUMA7LXDMgfdZPl70CmXNzHSkR5bujQoRg5ciRiYmJQpUqVTPcVrVq1qkbJ5Ma65U9srHlIp9MZHJ324nOtyJorw6RJk2BnZwcASE1NxYwZMzIdYKLV1XBkzSb7Mn3nnXcAAH379lWG6XQ6CCE0OQgn4/1lrhkgb90ePXoEGxsbJUdiYiISEhIMpnNyciq0uXi6TR4yMzND5cqVYWGR/u+Xs2fPomLFirCysjKYzpSX/pI5F5B+Cbec/Lhpcc/KnGTT6XT4888/TZToXzIvUwC4ceNGtuNfvHemKcheM0Deuj3/d5DRxF58rsVlR2XJxTXWPDR58mSD5x07dtQoiSFZcwFAcHCw1hGyJHM2mZcpoE0DeBnZawbIWTdZb8QuUy6usZKUpk2bhlGjRimbXTMkJydj7ty5mDRpkkbJKLfWr1+Pb775BhERETh8+DBKly6NRYsWwdfXV8qmJgvWLf/hUcEm0Lx5czx8+DDT8ISEBDRv3tz0gbKQmpqKxMRErWMAAKZOnWo0y+PHjzF16lQNEqW7cuUKtmzZolwkYufOnWjSpAnq1KmDGTNmaH6EpKzfteXLl2PEiBFo27YtHj58qGyOc3FxkeOE/ufI9Hcgc93Mzc0RGxubafi9e/dgbm6uQaLMhBD4888/sXPnTjx48MCkb0x57MXzHzPcuXNHWFhYaJBIiNWrV4shQ4aIH374QQghxLhx44SVlZUwMzMTLVu2FHfv3tUkVwadTidiY2MzDQ8KChLFihXTIJEQW7duFRYWFsLKykpYW1uLdevWCWtra9G6dWvRrl07YWFhIWbPnq1JtgwyfteEEMLf319s27ZNCCGEg4ODcn7huXPnhKurq2a5ZP87kLVuQmT9Xbt165awsbExeZ4HDx6IXr16icqVK4uPP/5YxMfHi0aNGgmdTid0Op1wd3cXZ86cMUkW7mPNQ2fPnlX+/8KFC4iJiVGep6WlYffu3ShRooTJc82YMQMzZsxAw4YNsWHDBhw8eBC//PILpk2bBjMzMyxZsgRffPEFli9fbvJsGdf51Ol0KF++vMHBB2lpaUhMTMTAgQNNngtIr9uYMWMwffp0rF27FgMHDsTs2bMxfPhwAMDKlSuxcOFCjB071uTZZP2uZYiIiECNGjUyDbe2tkZSUpIGieT+O8ggY90ybkKh0+mwatUqODg4KOPS0tKwf/9+VKxY0eS5Ro0ahcOHD6NXr17YsWMHWrduDSEEDh8+DDMzM4wZMwYTJkzAb7/9lvdhTNK+CymdTifMzMyEmZmZ8q+m5x92dnbiu+++M3kuPz8/sWHDBiGEEMePHxdmZmbif//7nzJ+165dolSpUibPJYQQa9euFWvWrBE6nU4sXrxYrF27Vnls2LBBhIaGapJLiPQ1hqtXrwohhEhLSxPm5ubi3LlzyviIiAhha2urSTZZv2sZ/P39xS+//CKEMFzzWrx4sahZs6YmmWT+O8ggY918fHyEj4+P0Ol0wtvbW3nu4+MjypcvL9566y1x5MgRk+fy8vISwcHBQgghbt68KXQ6nfjrr7+U8UePHhUeHh4mycI11jwUEREBIQTKlCmDY8eOwc3NTRlnZWUFd3d3TfZFREZG4o033gAA1K5dGxYWFqhSpYoyvmrVqoiOjjZ5LgDo3bs3gPS7yTRq1Eg5FUIGSUlJyoW+zczMYGtra3Bwla2trWZX7pH1u5Zh9OjRGDx4MJ48eQIhBI4dO4affvoJs2bNwqpVqzTJJPPfQQYZ65ZxfEGzZs2wdetWFClSRJMcL7pz5w7Kly8PAChRogRsbGzg7e2tjC9VqhTi4uJMkkWeX60CKONQ+Rdv9aS1p0+fwtraWnluZWVlcEUXCwsLTU48f15SUhKCgoLQqlUrg+F79uyBXq9HmzZtTJ5J5gsKyPpdy/DRRx/h2bNnGDNmDB4/fozu3bujRIkSWLx4Md5//31NMuWHvwMZ65ZBptNbgPTv/vP/eDQ3N8/092oqbKwmMGvWLHh4eBhcPQUAVq9ejbi4OE32yT2/H04IgUuXLilHQt69e9fkeV40btw4zJ49O9NwIQTGjRunSWMVQhjs901MTESNGjVgZmamjNeajN+1DP3790f//v1x9+5d6PV6uLu7a5Ylg+x/B4CcdQOAd999F7Vr18a4ceMMhs+dOxfHjh3D//73P5Nnen6f77Nnz7B27VoUK1YMAPDo0SOT5eB5rCbg4+ODDRs2oGHDhgbDjx49ivfff9/k9/fMuEKJsUWv9eXSMtja2uLixYvw8fExGH79+nVUqlRJkwM31q1bl6PpMjZna0G271pWUlNTkZqaanDgi6nlh7+DF8lQtwxubm74888/DTafA8C5c+fQsmVL3Llzx6R5fHx8crRWaoq/Aa6xmkBMTAyKFy+eabibm5sm+3Bk+XHNjrOzM65du5apsV69ehX29vaaZNKyYeaUbN81AFizZg1OnTqF+vXro0ePHhg/fjwWLFiAZ8+eoXnz5ti4cSNcXV1Nnkv2vwNZ65YhMTEx0+UfAcDS0jLT9XlN4fr16yZ/zyyZ5BCpQs7Pz0+sX78+0/Dvv/9e+Pr6apBIfv379xdVqlRRjsIVQogrV66IqlWrin79+mmSqUePHuK7776T4t6TWZHtuzZ9+nRha2srWrRoIYoWLSoGDhwoPD09xezZs8WcOXNEyZIlxcCBA02eS3b5oW61a9cWU6dOzTR88uTJmhyxLNN9a9lYTWD27NnC1dVVrF69Wly/fl1cv35dfPfdd8LV1VXMnDnT5Hm8vLzEhx9+KL777jtx7do1k79/Tjx8+FDUr19fWFhYKIfyW1hYiGbNmokHDx5okql58+bCzs5OmJmZiVKlSonevXuLdevWicjISE3yGCPbd03mU1pk/juQuW4Zfv31V2FhYSF69eqlnBLXs2dPYWFhoVzUwpR0Op0oWbKk6Nmzp1i9erWIiIgweYYMbKwmoNfrxZgxY4SNjY1yrqGdnZ3Rf+2ZwrRp00SLFi2UJlG6dGnx0Ucfie+//15ERUVpkskYvV4v9uzZI+bMmSOWLl0qQkJCtI4kUlNTxf79+8W0adMMGm3ZsmXFxx9/rPwYakW275qVlZXBPzysrKzEpUuXlOc3b94UlpaWWkST+u9A5ro9b8eOHaJhw4bCzs5OuLq6imbNminnkpra/v37xZdffmmwTH18fETfvn3F+vXrxc2bN02WhQcvmVBiYiIuXrwIW1tblCtXzuBQfy08ffoUhw8fRnBwMEJCQnD48GH8X3tnHhXVsXXx3Y3MgqjgACjagiIOCcboUxMmMYomxnlAY5yfivNIEhU1BIc8o6BxiChEjUM05qlRARVwwAEHQFRwABQTBUUFBUSEPt8ffH0DNBCTF25Vx/qt1Uu77l2r96quy+mqOvvUy5cvoVKp4OHhgY0bNzLVp6GgoACGhobcWFtKU1hYiHPnzuHQoUPYsGEDcnNzuUh24WWsKZVKZGRkSJmsZmZmSEhIgEqlAlDiPbS2tmbaZzw+B7rQbzxT+juNjo7GuXPn8PLlS9jb2+PGjRvV/vkisMrI7du3kZKSAhcXFxgbG2udF8iap0+fYuXKlVizZg3zAKFWq/HVV19hw4YNyMzMxM2bN6FSqbBgwQI0adIEY8aMYaYNKAn2MTExiI6ORlRUFC5cuAA7Ozu4urpi06ZNTLUB/Iw1pVKJyMhI1KlTBwDQuXNn/Pjjj7C1tQVQYmnp1q0bVwGCh+dAV/otOzsbe/fuRWpqKmbPno06derg8uXLqF+/PtMSmhpevHiB06dPIzw8HJs2bZLv+5RtbvwGk5WVRR4eHlLZOU3yy+jRo2nmzJnMdL148YKOHTtG8+fPp/fee48MDQ2pRYsWNG7cOKkoOSsWL15MKpWKtm/fTsbGxlKf7d69m/71r38x0RQZGUkLFiyQ+qply5Y0YcIE2rlzJ92/f5+JpvLwNtY0Oioqs6hpVyqVsusqDY/PgS70W0JCAllZWZG9vT3VqFFDGmvz58+nTz75hImmFy9e0PHjx8t8l46OjvTvf/+bfvjhB9mWg8WMVQZGjBiBhw8fIjg4GC1btpSWdCIiIjBjxgxcu3ZNVj1+fn7SLEulUsHV1VV6NWjQQFYtlWFvb4+NGzeia9euZZbBkpOT0alTJ3mPgPp/lEolGjduDF9fX/Tv379M2UBe4G2s3b1797XuY3GgN8/PAc/9psHT0xPt2rXDihUryjyjZ86cgbe3t+z2F1dXV1y4cAHNmjWDi4uL9F3Wr19fVh0AxIxVDurXr0/x8fFEVLaQdmpqKpmamsquR6FQkJ2dHa1fv575sViVYWRkRHfu3CGisn127do1Jn1GRDR37lzq2LEjGRgYUJs2bWjy5Mm0d+/eCo+3YwVvY41ndOE54Blzc3PJDld6rN25c4cMDQ1l11OjRg1q1KgRTZkyhX766Sd69OiR7BokLfKH8jePvLy8MsXaNWRlZTFJKjl8+DCio6MRGhqKadOmoXnz5nBzc5N+4fEwE2vVqhVOnTql9Yt8z549FR6jJQfLly8HUJIYdOrUKURHR2PFihUYOnQomjdvDldXV7i7u2PAgAFM9AF8jbXSR9n9EW3btq1GJRXD63PAe79pMDIyqrAQxI0bN5j0XXZ2tvRcLl++vMxzqfleZdPFLKS/QfTs2ZPmz59PRCW/7FJTU6m4uJgGDhxI/fv3Z6rt2bNndOjQIZo7dy69++67ZGBgQE5OTuTj48NU14EDB6hWrVq0bNkyMjExoa+//prGjh1LBgYGFBERwVRbeR4/fkxffPEFmZubM9/34mmsld8PrOrFGp6eA13pt3HjxlGfPn2osLBQGmt3794lZ2dnmjZtGlNtRCXf6eHDh2nOnDnSd9qqVStZPlsEVhm4du0aWVlZUY8ePcjAwIAGDBhALVu2pPr165epLMSSoqIiOnPmDPn6+nIRIIiIwsLCyMXFhUxNTcnY2Ji6dOlC4eHhrGVRcXExnTt3jpYtW0Y9evQgMzMzaVlx5MiRTLXxNNY0BSru3LlDP//8MzVr1ow2bNhACQkJlJCQQBs2bCAHBwcmxQQqg4fnQFf6LScnh7p06UIWFhakp6dHjRo1In19fXJxcaHc3Fym2oh+f06XLl1KH3zwgeRtlQORvCQTGRkZWL9+PS5dugS1Wo127drBx8enwrqucqBWq3Hx4kVERUUhOjoaMTExyMvLg62tLdzd3eHu7s6sNm5RURG++uorjB49usx5iqz5+uuvERUVhZiYGDx//hw2NjZwc3OT+qtp06asJQLgb6wBQIcOHbBo0SL07NmzTPvhw4exYMECXLp0iYkunp8DgN9+K01kZCQuX74sjTVPT08mOjTfpcYCp/kubWxspO/S3d1dnoQvWcL3G0xhYSG5ubnRjRs3WEuR8PLyInNzc1IoFGRjY0PDhg2j4OBgrmrgmpqaMi1JVhENGzakoUOH0nfffcdVXVINPI41DUZGRnT9+nWt9uvXr5ORkREDRbrxHPDYb0REr169Ij09PUpMTGSmoTxmZmakVCql73LTpk3MVgRF8lI1o6+vj6tXr3JVCKJWrVr4+uuv4e7uDgcHB9ZyKsTT0xPR0dEYOXIkaykS9+/fZy2hSngcaxpatmwJf39/bN68GUZGRgCAly9fwt/fHy1btmSiSReeAx77DSg5BN7Ozo55gYrSaL7L5s2bs5YiKi/JwaxZs6Cvr1/hwd2Citm4cSMWLVqEYcOG4Z133tE6Kq53796ya0pPT3+t+xo3blzNSiqH17EWGxuLjz76CGq1Gm+99RYAICEhAQqFAr/88gs6dOjAWCGf8NxvISEh2LNnD7Zv3y5ViBKUIAKrDEyZMgVbt26Fvb092rdvrxUkvvnmG1n1bN269bXuGzFiRDUrqRylUlnpNVaHT2sOxi4PlSoXqFAoUFRUJLc0Cd7GWmny8/Oxfft2JCcng4jg5OQEb29vZufr6sJzAPDXbxqcnZ1x+/ZtvHr1CnZ2dlp6Ll++LKue0aNH/+E9CoUCmzdvrnYtIrDKgLu7e6XXFAoFIiMjZVQD1K5du9JrCoUCeXl5KCoq4mqZhwcSEhIqbCci7Nq1C0FBQahZsyYePnwos7Lf4W2s8Yx4Dv43Fi9eXOV1Pz8/mZSU0Ldv30qvFRcX49ixY3j58qUs36cIrAKJBw8eYPHixdiyZQs8PDwQFhbGWhL3HDt2DL6+vrh58yZmzpyJ2bNno2bNmqxlccv169eRnp6OwsLCMu0slvYrg8fnQBf6jVf279+Pzz//HPfv38e8efPg6+tb7Z8pkpcEeP78OZYvX47AwEC0atUK4eHhVc58qougoCCMHz8eRkZGCAoKqvLeqVOnyqSqYi5dugRfX1+cOnUKY8eOxeHDh6UjvgTapKamom/fvkhMTIRCoYDm97xmCZ2HWSEvz0FpdKHfeCUmJgbz5s1DXFwcJk+eDF9f3ypXKf5OxIy1mujXrx9CQ0Nhbm6Ofv36VXnvvn37ZFJVlsLCQqxduxYBAQGwtLSEv78/03J8TZs2xcWLF1G3bt0qPaEKhQKpqakyKvud27dv44svvsBPP/2EQYMGwd/fXzojkxW6MNY++ugj6OnpYdOmTVCpVIiNjcXjx48xa9Ys/Oc//8H777/PRBfA33NQGt76rU6dOrh58yYsLS1Ru3btKjPQnzx5IqOy37l27Rp8fX0RFhaGESNGYPHixdJxe3IhZqzVRK1ataRBV6tWLcZqykJE2Lp1KxYuXIiioiIEBARgzJgx0NPTY6orLS2twv/zwqRJk7B582a4u7vj4sWLePvtt1lLAsD3WNNw9uxZREZGwsrKCkqlEkqlEu+99x6WLl2KqVOnIi4uTnZNvD4HpeGt31atWgUzMzMAwOrVq2X97D/i3r17WLhwIbZv344PP/wQV65cYWZJEjPWN5C2bdsiJSUFU6ZMwfTp0yss2g4A5ubmMivjG6VSCSMjIzg6OlZ5n9zZkLpA7dq1cenSJahUKjRr1gzBwcFwd3dHSkoK2rRpg/z8fNk16cJzwGO/8YqJiQkUCgWmTJmCzp07V3qfHPvSIrDKRFZWFu7cuQOFQoEmTZqgbt26zLSUtrJUZR9htX+Tl5eH5cuXY9++fVKfNW3aFAMGDMDs2bMr/QNY3fxRFqQGubMhy8PTWNPw/vvvY9asWejTpw+8vb3x9OlTzJ8/H9999x0uXbqEq1evyq6J9+cA4LPfNOTk5ODo0aPSWFOpVOjatSuzHyJVWfQ0yPV9isBazVy7dg0TJ05ETExMmXZXV1esW7fuD2c/1cGJEyde6z5XV9dqVqJNYWEhOnfujKtXr8LLywuOjo4gIiQlJSEsLAzt2rXDyZMnoa+vL7s23uFxrGkIDw9HXl4e+vXrh9TUVHz44YdITk5G3bp1sXv3bnh4eMiuiefnQAOP/QYA27dvx+TJk7WOjatVqxY2bNiAwYMHM9HFCyKwViMZGRlo3bo1rKysMGHCBClIXL9+HZs2bcLjx49x9epVkU1aisDAQCxduhQnTpxAixYtylxLTk6Gm5sbvvjiC0yZMoWRwhKKiooQHR2NlJQUeHt7w8zMDPfv34e5uTkTu40ujrUnT578YQKMQBvW/Xb58mV07NgRw4YNw4wZM8qMtdWrV2PXrl24cOGCVCnqjaT6yxG/ucydO5fatWtHL1680LqWn59P7dq1I19fXwbKfuf27dv0xRdf0JAhQygzM5OIiI4cOUJXr15losfFxYXWrl1b6fWgoCBycXGRUZE2d+7cIUdHRzIxMSE9PT2paPu0adPo3//+NxNNujDWiIhu3bpFYWFhlJ+fT0REarWasaISeHsOysNTv40cOZIGDBhQ6fX+/fvTqFGjZFT0O2q1mlJTU+nVq1dERPTy5UvatWsXff/99/To0SPZdIjAWo04OzvT7t27K72+c+dOcnZ2llFRWaKjo8nY2Jg8PT3JwMBAChDLly9ndgC7paVllX/MEhMTydLSUkZF2nz88cc0fPhwevnyJdWsWVPqt+joaLK3t2eiifexlpWVRR4eHtLh3Zo+Gz16NM2cOZOZLiI+nwMNPPabg4MDHT16tNLrR48eJQcHBxkVlZCcnEx2dnakVCrJ3t6eUlNT6Z133iFTU1MyMTEhS0tLunnzpixa/ni3V/CXSU1NRbt27Sq93r59e2Z+TADw9fWFv78/jh49CgMDA6nd3d0dZ8+eZaIpOzu7ymSbunXrIicnR0ZF2pw+fRrz588v02cAYGdnh99++42JJt7H2owZM6Cvr4/09PQyyWeDBw9mXtmIx+dAA4/9dv/+/SpPkGnevDmT52DevHl46623EB8fjw8//BAffvghbG1t8fTpUzx9+hRdunTBkiVLZNEifKzVyPPnz6vMkDMzM0Nubq6MisqSmJiIHTt2aLVbWVnh8ePHDBSVHFZclY9QqVQyrzajVqsr1PDrr79KHj+54X2sRUREIDw8XMuo7+DggLt37zJSVQKPz4EGHvstPz9fOsKuIgwNDVFQUCCjohLOnDmDiIgItGnTBv7+/ggMDMTGjRulRMd58+ZhyJAhsmgRgbWaef78eaWD8NmzZ1KJMhZYWFjgwYMHWlWO4uLiYGNjw0QTEaFr166oUaPiocny5BgN3bp1w+rVq/Hdd98BKEnhz83NhZ+fH3r27MlMF89jLS8vr0KbVFZWFgwNDRko+h0enwMNvPZbeHh4pcVIsrOz5RXz/+Tm5krH15mamsLU1BQNGzaUrtva2iIzM1MWLSKwViNEVOWSCZU6bowF3t7emDdvHvbs2QOFQgG1Wo2YmBjMnj2b2VFZr+MB7d+/vwxKKmfVqlVwd3eHk5MTCgoK4O3tjVu3bsHS0hI7d+5koon3sebi4oKtW7fiyy+/BABpvGkOp2YJj8+BBl777dNPP63yOouxZm1tjfT0dOk85BUrVpTJgn/06JGoFfxPgHef3KtXrzBy5Ejs2rULRIQaNWqguLgY3t7eCA0N5aq0G2+8ePECO3fuxOXLl6FWq9GuXTsMGzYMxsbGTPTwPtauX78ONzc3vPPOO4iMjETv3r1x7do1PHnyBDExMWjWrBkTXQDfzwHP/cYbEyZMQPv27TF27NgKry9btgynTp3CoUOHql2LCKwCpKSkIC4uDmq1Gs7OznBwcGAtCQB/XlHB/0ZGRgbWr1+PS5cuST9GfHx8yizXsYTX54D3ftMV0tLSYGRkJEu/icAqEykpKQgJCUFKSgoCAwNRr149hIWFoVGjRmjVqhVredxx9+5d9OjRA+np6Xj58iVu3rwJlUqF6dOno6CgABs2bGCq7+bNm4iOjsbDhw+hVqvLXFu4cCEjVSXo0lgrKCjA2rVrMXv2bNZSdArW/UZEuHPnDho1aoQaNWqgsLAQP//8M16+fImePXvC0tKSia7KyM7OhoWFhWyfJwKrDJw4cQJeXl7o0qULTp48iaSkJKhUKqxYsQKxsbHYu3cvE13FxcUIDQ3F8ePHKwwQkZGRTHQBQJ8+fWBmZobNmzejbt26SEhIgEqlwokTJzB27FjcunWLmbZNmzZh4sSJsLS0RIMGDcrsJykUCqZF+Hkca1lZWTh//jz09fXRtWtX6Onp4dWrV1i3bh2WLl2KoqIiZGVlyapp5syZr33vN998U41KKofHfgOAGzduoHv37rh37x5UKhUiIiIwcOBAJCcng4hgYmKCM2fOMJvxL1++HE2aNJHKKg4aNAg//fQTGjRogMOHD8tSEUoEVhno1KkTBg4ciJkzZ8LMzEwKEhcuXECfPn2YeR8nT56M0NBQ9OrVCw0bNtRKOFi1ahUTXQBgaWmJmJgYtGjRokyf3blzB05OTkxP9bCzs8OkSZMwb948Zhoqg7exdubMGfTq1Qs5OTlQKBRo3749QkJC0KdPH6jVakyfPh2jR4+W/WCF1038USgUTH5g8tpvQMmPXiKCv78/tmzZgoiICDg4OGDPnj0gIgwaNAhmZmbYtm2b7NoAQKVSYfv27ejcuTOOHj2KQYMGYffu3fjxxx+Rnp6OiIiI6hchSxmKNxxTU1NKTU0lIipTqSctLY0MDQ2Z6apbty4dOnSI2edXRe3atenatWtEVLbPTp06RfXq1WMpjczMzCQ9vMHbWPPw8KDBgwdTYmIizZgxgxQKBTVt2pS+//57bsoZ8gjP/WZlZUVxcXFERJSbm0sKhYJOnTolXT9z5gw1btyYkToiIyMjSk9PJyKiqVOn0vjx44mI6MaNG2RhYSGLBlF5SQY0PrnysPbJGRgYwN7entnnV4XGK6qBF68oAAwcOFCeX71/Ad7GWkJCAhYsWIDWrVvD398fCoUCy5cvx4gRI0Tx/Srgud948otWRO3atXHv3j0AQFhYGDw9PQGU7AvLVVxG+FhlgFef3KxZsxAYGIi1a9cyf1jLw5tXNCgoSPq/vb09FixYgHPnzqFNmzZaR9hNnTpVbnkSvI21J0+ewMrKCkDJQdQmJiZwdnaWXUd5+vXrh9DQUJibm6Nfv35V3rtv3z6ZVP0Or/0G8OUXrYh+/frB29sbDg4OePz4Mby8vAAA8fHxsk0kRGCVga+++gojR46EjY0NiAhOTk6ST27+/Pmyain/RyQyMhJHjhxBq1attAIEiz8oGqytrREfH1/GKzpmzBhmXtHy+801a9bEiRMntPyjCoWCaWDlaawBJf2hqQhF/1+kIj8/X+scT7kPx65Vq5b0Y9Lc3Jy7H5a89hsAeHp6Ijk5Ge+99x4AYOLEiWWuR0REVFm3urpZtWoVmjRpgnv37mHFihWSNe/BgweYNGmSLBpE8pKM8OCTGzVq1GvfGxISUo1KBNUJD2MNKKntXDpoUbkKUJr3ctd/PnDgALy8vLR+TPICr/32OsjpF+UVEVgF3MKzV1TwevBaEUpPTw8ZGRmwsrKCnp4eHjx4wNUh8Lz22x8ht1+0MlJSUrB69WokJSVBoVCgZcuWmD59OlQqlSyfLwKrDPDqF01LS0NRUZHWbObWrVvQ19dHkyZNmOgC+PaKDhgwAO3bt4evr2+Z9q+//hqxsbHYs2ePrHp0wZPJGw0aNMCmTZvw0UcfQalUIjMzU9rTFLwePPhFKyI8PBy9e/fG22+/jS5duoCIcObMGSQkJODgwYPo1q1btWsQgVUGePWLurq6YvTo0VoFtbdv347g4GBER0cz0QXw7RW1srJCZGQk2rRpU6Y9MTERnp6esmdE8u7J1MBTRahFixZhyZIlr7W3ynq5lad+Kw0XftEKcHZ2Rvfu3bFs2bIy7b6+voiIiJDnR7kspp43HF79omZmZnTr1i2t9lu3blGtWrXkF1QKnr2iRkZGlJycrNWelJRERkZGDBTxT3R0NBkbG5OnpycZGBhI3+3y5cupf//+TDQlJSXRwYMHSaFQUGhoKP33v/+t8MUSHvtNAw9+0YowNDSkmzdvarXfuHFDNi+38LHKAK9+UU3mYXlycnKY/0rn2SvaunVr7N69W6t9165dcHJyYqCIf3x9feHv74+jR4/CwMBAand3d8fZs2eZaHJ0dMSHH34IPz8/DBw4EB9//HGFL5bw2G8aePCLVoSVlRXi4+O12uPj42XbRxd2Gxng1S/6/vvvY+nSpdi5c6d0NFZxcTGWLl0qpdLLia54RRcsWID+/fsjJSUFHh4eAIDjx49j586dsu+vAvx7MoGSZfIdO3ZotVtZWeHx48cMFP3O65wBzAqe+40Hv2hFjBs3DuPHj0dqaio6d+4MhUKB06dPY9myZbIdWiACazWhC37RFStWwMXFBS1atMD7778PADh16hSePXvGZC9OV7yivXv3xn//+18EBARg7969MDY2Rtu2bXHs2DEmWZq8ezKB3ytCNW3atEw76+pjAPD48WMsXLgQUVFRFSYXPnnyhJEyvvuNB79oRSxYsABmZmZYuXIlPvvsMwAlvvglS5agb9++smgQyUvVhK74Re/fv4+1a9ciISFBChCTJ0+WSpYJ+Id3TyYAzJ07F2fPnsWePXvQvHlzXL58GZmZmRgxYgRGjBjBdNbo5eWFlJQUjBkzBvXr19f6YVI+uU9OeO43XUCz1ZWbm4uAgAAEBwfjxYsX1f/BsuzkCgSCakOpVNLDhw+l/2dmZjJWpE1hYSF5e3uTUqkkhUJB+vr6pFQqafjw4VRUVMRUW82aNSk+Pp6phsrgud+IiG7fvk2TJ0+mrl27kqenJ02ZMoVZ0uHTp0/J29ubLC0tqWHDhhQYGEjFxcW0cOFCMjExofbt29OOHTtk0SJmrDLAs18UAPLz85Geno7CwsIy7W3btmWkiD+vaGmKi4uxatUqyVZQvt/kXjrUJU8mLxWhSvPuu+9izZo1+Ne//sVaSqXw2G88+EVLM2nSJBw8eBCDBw9GWFgYkpKS0L17dxQUFMDPz0/ebRpZwvcbjouLC4WGhmq1b9u2jVxdXeUX9P88fPiQevXqRUqlssIXSywtLenKlSta7VeuXGF+bNyCBQuoYcOG9PXXX5ORkRF9+eWXNGbMGKpbty4FBgbKrsfPz48UCkWl3yMv3ymvxMbGkoeHB0VHR1NWVhbl5OSUeQkq5u2336Z58+Zptc+bN4+cnZ1l19O4cWM6evQoERGlpKSQQqGgadOmya6DSMxYZcHc3ByXL1/WypS7ffs22rdvj+zsbCa6hg0bhjt37mD16tVwd3fHzz//jMzMTPj7+2PlypXo1asXE10AYGxsjPj4eLRo0aJMe3JyMpydneXZJ6mEZs2aISgoCL169YKZmRni4+OltnPnzlWYxVndJCcn4/bt2+jduzdCQkIqLSsnp31EVypC3bp1C0OHDkVcXFyZdmJUj1dX+s3IyAiJiYlas+ebN2+ibdu2KCgokFWPvr4+7t69C2trawAlpwLFxsaidevWsuoARFawLPDqF42MjMT+/fvx7rvvQqlUws7ODt26dYO5uTmWLl3KNLBqvKLlawLz4BXNyMiQqi7VrFkTOTk5AIAPP/wQCxYsYKLJ0dERjo6OkifTxMSEiY7SlA9UlcE6i3nYsGEwMDDAjh07Kkxekhtd6TeNX7R8YJXTL1oatVpdJoFPT08PpqamsusARGCVBd78ohry8vKkB6BOnTp49OgRmjdvjjZt2jCtxQvw5xUtja2tLR48eIDGjRvD3t5eOibrwoULMDQ0ZKqNpyzRqKgo1hJei6tXryIuLk5rdYQVutJvPPhFS0NEGDlypPQMFhQUYMKECVrBVQ57owisMsCbX1RDixYtcOPGDTRp0gRvv/02Nm7ciCZNmmDDhg3Mj3zizStamr59++L48ePo2LEjpk2bhqFDh2Lz5s1IT0/HjBkzmGrj2ZPJK+3bt8e9e/e4Cay6Ag9+0dKUt0UNHz5cdg0axB6rTPDoF/3hhx/w6tUrjBw5EnFxcejevTseP34MAwMDhIaGSqdWCKrm/PnziImJgb29PXr37s1UC0+eTF2oCAUAe/bswaJFizBnzpwKq3zJnR2vK/1WGmZ+UU4RM1aZsLa2RkBAAGsZZRg2bJj0f2dnZ9y5cwfJyclo3LgxLC0tGSrTLTp27IiOHTuylgEAOH36NE6fPs3syK7SlK4IVatWLcZqKkfzA3L06NFSm0KhYJa8xHu/ZWdnw8fHBxEREdDX14evry8mT56MxYsX4z//+Q+cnJywZcsW1jKZImasMsKTX/TZs2eoWbMmlMqy5zCo1Wrk5ubC3Nxcdk2l4c0rCgCXLl3C7NmzsX//fq3+ycnJQZ8+fbB69WqmQY03T2ZkZCRcXFxQowa/v+Hv3r1b5XU7OzuZlPwOz/3GlV+UV5iYfN4wePOL7tu3jxwcHCgvL0/rWl5eHjVv3pwOHDggu67S8OYVJSIaOnQoLVmypNLr/v7+NGzYMBkVacObJ7N8JaiOHTvSr7/+KrsOXYPnfuPJL8orIrDKgLe3N3Xu3JliY2PJ1NSUIiIiaNu2bdSiRQv65ZdfZNfTrVs32rRpU6XXN2/eTB988IGMirRRqVRS39SsWZNu375NRESBgYE0dOhQZpoSEhIqvX7lyhVq2rSpjIq0uXnzJr3zzjtaP940BSTkRqFQlAkQNWvW5PKc3a1bt1Lnzp2pYcOGdOfOHSIiWrVqFbPzWHnutxo1atBvv/0mvTc2NqbExESGivhDnMcqA5GRkVi1alUZv+jw4cOxYsUKLF26VHY9V69ehZubW6XXXVxckJiYKJ+gCqjKK3ro0CEmmn777TeYmZlVer1mzZp48OCBjIq0Ke3JPH78OCIjIxEZGYmoqCimGeg8s379esycORM9e/ZEdna2tKdqYWGB1atXsxXHITz5RXmFvwX8fyC8+UWfPn2KoqKiSq+/evUKT58+lVGRNjx6Ra2srHDjxg2tI7w0JCcnM0/64s2TqVAoymQml3/PA2vWrMGmTZvQp08fLFu2TGpv3749Ez8mwHe/EUd+UV4RgVUGePOLNmnSBBcvXoSjo2OF1y9evMgkYaM0PHpFPT098dVXX6FHjx5a14gIAQEB8PT0ZKDsd3jzZBIRunbtKiXh5Ofn46OPPoKBgUGZ+1gWJElLS4Ozs7NWu6GhIfLy8hgo4rvfePKL8ooIrDIwffp0aYnQz88P3bt3xw8//CD5ReWmX79++OKLL9CtWzfUr1+/zLWMjAzMnz+f+cNSeuYwYMAANGrUiLlXdP78+XjnnXfQsWNHzJo1Cy1atIBCoUBSUhJWrlyJmzdvMj1bFwCmTJmCadOmcePJLF8JSs5axa9L06ZNER8fr/Vj8siRI2jZsiUTTTz3G+sxrgsIuw0D8vPzmfpFnz9/jk6dOiE9PR3Dhw8vEyB++OEHNGrUCOfOnatyP/FN5eLFixg5ciSuX78uLc0REZycnBASEoJ3332Xqb7y9imArSdTFwgJCcGCBQuwcuVKjBkzBsHBwUhJSUFAQAA2b96MIUOGsJYo0DFEYK1mePWL5uTk4LPPPsPu3bul/dTatWtj8ODBCAgIqPR0lOpGF7yiQEmh8Vu3boGI0Lx5c7z99ttM9Wjg0ZMJAB4eHti3b5/WuHr27Bn69OnDPLFq06ZN8Pf3x7179wAANjY2WLx4Mbp37w4bGxum2kpTWFiIwsJC1KxZk7UUQVUwykZ+I9AFv6haraaHDx9SZmYmqdVqplqIdMMrKvjzlLePaMjMzKQaNWowUFQxjx49oszMTLp//z5NnjyZjIyMmGnZsmULTZ48mbZv305ERL6+vmRgYEBKpZI8PT0pKyuLmTZB1Qi7TTWyfv16zJ07t8IjvExMTDBv3jysXbuWgbLf0Sxn3rx5E2fOnMGjR4+Y6jl//nyV+0m9e/fGmTNnZFSkTXFxMTZv3gxvb294enrCw8OjzIs127ZtQ5cuXWBtbS3NYFevXo39+/fLruXKlSu4cuUKAOD69evS+ytXriAuLg6bN29mNiPMzs7GsGHDYGVlBWtrawQFBaFOnTr49ttvYW9vj3PnzjErzffVV1/Bx8cHSUlJmDp1KiZOnIjQ0FAsWbIEy5YtQ3JyMubPn89Em+A1YB3Z/8k0bNiQbt26Ven1W7duUcOGDWVUVJbc3FwaNWoU1ahRgxQKBSkUCqpRowaNHj26wlm2HBgaGlJqamql11NTU5nOIoiIfHx8yNTUlAYNGkTTpk2j6dOnl3mxZN26dWRpaUn+/v5kbGwsFRUICQkhNzc32fVoClNoilSUf5mYmNDmzZtl10VENHHiRLK1taVZs2ZRq1atSKlUkpeXF7m7u1N0dDQTTRrs7e1px44dRER04cIFUiqVtGfPHun64cOHqXHjxqzkCf4AEVirESMjI0pKSqr0+vXr15kGifHjx5NKpaLDhw9LJe8OHTpEzZo1owkTJjDRZGtrS0eOHKn0+uHDh8nW1lZGRdrUrVuXDh06xFRDZbRs2ZJ+/vlnIipbrScxMZHq1q0ru547d+5QWloaKRQKunDhAt25c0d63b9/n4qKimTXpIHn0nwGBgaUnp5e5n1ycrL0/tdffyV9fX0W0gSvgbDbVCO8+0V/+ukn7N27t0wVpp49e8LY2BiDBg3C+vXrZdekC15RAwMD2NvbM9VQGbx5MjXju/y5sDxw//59ODk5AQBUKhWMjIwwduxYxqpKePXqVZlCKAYGBmWsUzVq1BAZ3hwj9lirEY1fNDMzU+uaxi/av39/BspKyM/P1/KxAkC9evWQn5/PQFGJVzQxMREdO3bEjz/+iISEBFy5cgW7d+9Gx44dkZiYiC+++IKJNg2zZs1CYGAgiMOEeo0nszwsPZkAsHTp0gr3K7ds2YLly5czUMR/ab7Se9JEhOTkZOn9tWvXWMsTVIGw21QjvPtFu3btirp162Lr1q0wMjICALx48QKffvopnjx5gmPHjjHRxaNXtPyB05GRkahTpw5atWqlVYSBZSk3Xj2ZTZo0wY4dO9C5c+cy7efPn8eQIUOQlpYmuyalUgkvLy9pZnjw4EF4eHhwUZpPqVRK/uPyCF8y/4jAWs3w6hcFSurK9ujRAwUFBXjrrbegUCgQHx8PIyMjhIeHo1WrVsy0AXx5RUeNGvXa97KuTMOjJ9PIyAhJSUladZZTU1Ph5OSEgoIC2TW97nfK4vv8Iz+yBtalRwUVIwKrTBARsrKyQESwsrLipqD2ixcvsH37diQnJ0uzwmHDhsHY2Ji1NMH/SFZWFtRqNYqLixEQEIDg4GC8ePGCiRYHBwf4+flplcrctm0b/Pz8kJqaykSXQFAdiOQlmSjtF7116xaaN28OKysrxqoAY2NjjBs3jrUMLYqLixEaGorjx4/j4cOHWskvLCv18FhFKDs7Gz4+PoiIiIC+vj58fX0xefJkLF68GP/5z3/g5OTEzJMJAGPHjsX06dPx6tUryet7/PhxzJ07F7NmzWKmi1dsbGzg4eEBd3d3uLu7V3qikoBPxIxVBvLy8jBlyhRs27ZN2hPR09PDiBEjsGbNmgoLSFQnJ0+efK37XFxcqllJ5UyePBmhoaHo1asXGjZsqDXDX7VqFSNlJftfGRkZ0lGAGh4+fAgbGxu8evVKdk2TJk3CwYMHMXjwYISFhSEpKQndu3dHQUEB/Pz84OrqKrum0hARfH19ERQUhMLCQgAly8Pz5s3DwoULmWrjkS+//BInTpzA2bNnUVBQgEaNGpUJtLa2tqwlCqpABFYZ+Pe//41jx45h7dq16NKlCwDg9OnTmDp1Krp16ya7raWiQu0aNAFMoVBUeWZrdWNpaYmtW7eiZ8+ezDSUR1NB6O2335aSlzQUFxcjLCwMGzduxJ07d2TXZmdnh82bN8PT0xOpqamwt7fH1KlTuTuoOzc3F0lJSTA2NoaDgwOzs3V1hVevXuHs2bOIjo6WAu3Lly+hUqng4eGBjRs3spYoqAARWGXA0tJSyy8KAFFRURg0aJDsZQRzcnIqbM/Pz0dgYCCCgoKgUqlw9epVWXWVxtraGtHR0WjevDkzDeXRZGoCqDBb09jYGGvWrMHo0aPllgZ9fX3cvXsX1tbWAEpKZsbGxqJ169aya6mK27dvIyUlBS4uLjA2NpayWwWvx9OnT7Fy5UqsWbMGubm5IiuYU8Qeqwzw5hetVatWmfdqtRpbtmzB4sWLoVQq8e2332odZiw3Gq/o2rVrufnDm5aWBiKCSqVCbGxsmT1yAwMD1KtXD3p6eky08e7JfPz4MQYNGoSoqCgoFArcunULKpUKY8eOhYWFBVauXMlaIpcUFBQgJiYG0dHRiI6OxoULF9CkSRMMHjyY+fK+oHLEjFUGePWLAiUevc8//xyPHj3CZ599hilTpjBbntMVryiP8OzJBIARI0bg4cOHCA4ORsuWLZGQkACVSoWIiAjMmDFDFDwoh5+fH6KionDhwgWoVCq4urpKrwYNGrCWJ/gDxIxVBgIDA9GjRw/Y2tpW6BdlwYkTJzBv3jwkJiZi2rRpmDdvntZMVm7Kf37fvn0ZKdHmwIED8PLygr6+Pg4cOFDlvb1795ZJ1e+UX2Eob2thTUREBMLDw7WSbhwcHF7bs/km8eWXX6Jx48ZYtWoVBg4ciLp167KWJPgTiBmrTPDkF+3ZsyeOHz+OUaNGYdGiReIX8GtQOhP4j5K/xL6XNmZmZrh8+TIcHBxgZmYmzVgvXLiAHj164PHjx6wlckVYWJi0/BsXF4fmzZvDzc1NmrXyYNUTVI4IrG8gSqUSNWrUgKmpaZX7l0+ePJFRVVl49IoK/jq9evVCu3bt8OWXX8LMzAxXrlyBnZ0dhgwZArVajb1797KWyC3Pnz/HqVOncOLECURFRSEhIQH29vZwd3dnfp6zoGJEYK1GePWLfv/99691H8sEJh69osHBwfDw8IBKpZL9s3Wd69evw83NDe+88w4iIyPRu3dvXLt2DU+ePEFMTAyaNWvGWiL3FBcXIzY2FgcOHMC6detEVjDHiMBajeiCX5Q3ePaKmpqaoqCgADY2NpJR38PDA40bN5Zdiy6SkZGB9evX49KlS1Cr1WjXrh18fHzQsGFD1tK4RK1W4+LFi4iKikJ0dDRiYmKQl5cHW1tbafyxzt4XVIwIrNUI737RCxcuQK1Wo2PHjmXaz58/Dz09PbRv3152TTx7RV+9eoVz585JS3Lnzp1DQUEB7OzsylTF0XhJBSW8evUKH3zwATZu3MiVL5lnevbsiZiYGDx//hzW1tZwc3OTxpdYMeEfEVhlpLxfdNGiRfj000+rnNlWJx06dMDcuXMxYMCAMu379u3D8uXLcf78edk13b17l1uvaHk0gVYzozh//jxevnwpViAqwMrKCmfOnIGDgwNrKTrB0KFDpUAq+kz3EHYbmeDJL6rh+vXraNeunVa7s7Mzrl+/zkDR78dglS+6zyPFxcUoLCzEy5cvpYAqiqVXzIgRI7B582YsW7aMtRSdYOfOnawlCP4HRGCtZnj0i2owNDREZmam1tLSgwcPUKOG/EODd69oQUEBzpw5g+joaERGRuLixYtQqVRwcXHB5MmT4erqKpaBK6GwsBDBwcE4evQo2rdvr1W44ptvvmGkjE+2bt36WveNGDGimpUI/gpiKbga4d0vOmTIEGRkZGD//v1SsM/OzkafPn1Qr149/Pjjj7Lq4d0ramRkhPr166N3795wcXGBq6urVtayoGLc3d0rvaZQKIR9qhy1a9eu9JpCoUBeXh6KiopEVjCniMBajfDuF/3tt9/g4uKCx48fw9nZGQAQHx+P+vXr4+jRo2jUqBETXbzSsWNHxMfHo0WLFpJZ383NTVTFEcjGgwcPsHjxYmzZsgUeHh4ICwtjLUlQASKwViO64BfNy8vDDz/8gISEBBgbG6Nt27YYOnSoVm1eueDdK5qXl4dTp05JCUsVVcURs1jB383z58+xfPlyBAYGolWrVli6dGmVqwACtojAKuAKXfOKaqriHD16FCEhIcjNzRVZwf9Pv379EBoaCnNzc60DFsojDlWomMLCQqxduxYBAQGwtLSEv7+/Vha/gD9E8pIM8OgX1bBt2zZs3LgRqampOHv2LOzs7LBq1SqoVCp8/PHHsuvJzs4u4xX18fHh0iuqVqtx4cIFREdHIyoqSjLva7KaBSWHKmi2QHhJ2NMViAhbt27FwoULUVRUhICAAIwZM4Ybq5ngDyBBtfPuu+/Snj17tNp/+ukn6tChAwNFJaxbt44sLS3J39+fjIyMKCUlhYiIQkJCyM3NjZmu0hQWFtLJkydp8eLF5O7uTiYmJqSnp8dES2xsLC1fvpy8vLzIzMyMFAoFNWrUiD755BPasmULpaWlMdEl+OfRpk0bMjExoXnz5tGDBw8oJyenwpeAT8RSsAzUrFkTV65c0do3TEtLQ9u2bfH8+XMmupycnBAQEIA+ffqUOXHk6tWrcHNzQ1ZWFhNdpdEc9BwZGYno6GhcvHgRjRs3xq1bt2TXolQq0bBhQ6kKjpubG+zt7WXXoatkZWXhzp07UCgUaNKkiUj6qoLSWfEVJT4SkThJiWPEUrAM8OYX1ZCWliZlA5fG0NAQeXl5DBTx7RVNSkpCixYtmHy2LnPt2jVMnDgRMTExZdpdXV2xbt06ODo6MlLGL1FRUawlCP4HRGCVgW7duuGzzz7T8ot+/vnn6NatGzNdTZs2RXx8vNa+4JEjR+Dk5MREk4WFheQVnTZtGldZtpqgyvOeOW9kZGRI54d+8803cHR0BBHh+vXr2LRpE1xcXHD16lVuvmNecHV1ZS1B8L/AdiX6zeDXX38llUpFtWrVIjc3N3JzcyMLCwtq0aIFpaenM9O1ZcsWsrGxoV27dpGpqSnt3LmT/P39pf+zoEOHDmRgYEBt2rShKVOm0N69eykrK4uJlsrgdc+cR+bOnUvt2rWjFy9eaF3Lz8+ndu3aka+vLwNlusPt27fpiy++oCFDhlBmZiYRER05coSuXr3KWJmgMkRglYnc3FzauHEjTZo0iWbNmkXff/89FRYWspZF3333HTVu3JgUCgUpFAqytbWl4OBgpppyc3PpyJEjNHfuXOrQoQPp6+tTq1atyMfHh3788UfpjwsrTE1NpUSv0qSmplLNmjUZKOIXZ2dn2r17d6XXd+7cSc7OzjIq0i2io6PJ2NiYPD09ycDAQBp3y5cvp/79+zNWJ6gMkbwkAFCSWKJWq7lckuPNK1q3bl388ssv6NSpU5n2M2fOoFevXnj69CkjZfxhYWGBixcvVprkdfv2bbRv3x7Z2dnyCtMROnXqhIEDB2LmzJllEgwvXLiAPn364LfffmMtUVABbM4rewPZtm0b3nvvPVhbW+Pu3bsAgFWrVmH//v2MlQEPHz5EUlISbt68iUePHrGWI6FWq3H+/HmsW7cOQUFBCA4OxrNnz5iXWtTsmZc+b5eHPXMeef78OczNzSu9bmZmhtzcXBkV6RaJiYno27evVruVlRUeP37MQJHgdRCBVQbWr1+PmTNnwsvLC0+fPpVS5GvXro3Vq1cz0/Xs2TN88sknsLa2hqurK1xcXGBtbY3hw4dXekh7dXPhwgWsWLECPXv2hIWFBTp16oRvv/0W9erVQ1BQEFJTU5GWlsZEm4aVK1fi3r17sLOzkwpWNG3aFBkZGVi5ciVTbTzy/PlzPHv2rNKXWDSrHAsLCzx48ECrPS4uDjY2NgwUCV4HsRQsA7z6RQcNGoT4+HisWbMGnTp1gkKhwJkzZzBt2jS0bdtW9tNtAN3xivJWY5lXlEpllQdQkPBjVsncuXNx9uxZ7NmzB82bN8fly5eRmZmJESNGYMSIEfDz82MtUVABIrDKgLGxMZKTk2FnZ1cmsN66dQtt27bFixcvmOgyNTVFeHg43nvvvTLtp06dQo8ePZh4WW/cuCG8ov8gTpw48Vr3CXtJxbx69QojR47Erl27QESoUaMGiouL4e3tjdDQUFHikFOEj1UGePSLAiVJOBXVcK1Vq1aV50FWJ7riFeWtxjKviID5v6Gvr48ffvgBS5YsQVxcHNRqNZydneHg4MBamqAKxB6rDMyZMwc+Pj7YvXs3iAixsbH46quv8Pnnn2POnDnMdM2fPx8zZ84ss4eTkZGBOXPmYMGCBcx0AYCPjw/u3bun1f7bb7/Bx8eHgaLf4XXPnHdSUlIwf/58DB06FA8fPgQAhIWF4dq1a4yV8U+zZs0wYMAADBo0SARVHUAsBcvEpk2b4O/vLwULGxsbLFq0CGPGjGGmydnZGbdv38bLly+lY9nS09NhaGio9fBevnxZVm281lcG+N0z55kTJ07Ay8sLXbp0wcmTJ5GUlASVSoUVK1YgNjYWe/fuZS2RG2bOnPna937zzTfVqETwVxFLwTIxbtw4jBs3jiu/aJ8+fVhLqBRe6ysDfNZY5h1fX1/4+/tLfkwN7u7uCAwMZKiMP+Li4l7rvqqSwgRsEYFVRh4+fIgbN25AoVBAoVDAysqKqR6eMwp5ra8M8LtnzjOJiYnYsWOHVrvwY2ojCvDrPiKwysCzZ8/g4+ODnTt3Qq1WAwD09PQwePBgfPvtt8wOgb537x4UCgVsbW0BALGxsdixYwecnJwwfvx4Jpo0rFy5Ei4uLrCzs5Nmh/Hx8ahfvz62bdvGVJtmz7ygoEDaM9+5cyeWLl2K4OBgptp4RePHbNq0aZl24ccU/BMRe6wywKNfFADef/99jB8/Hp988gkyMjLQvHlztG7dGjdv3sTUqVOxcOFCJro08OwV5XHPnGeEH/P16devH0JDQ2Fubo5+/fpVee++fftkUiX4M4jAKgM8+kWBkizWc+fOoUWLFggKCsLu3bsRExODiIgITJgwAampqUx06RI87ZnzjPBjvj6jRo1CUFAQzMzMMHLkyCr3UkNCQmRUJnhdxFKwDPDoFwVK/tgZGhoCAI4dO4bevXsDABwdHSssoyY3vHtFedsz5xnhx3x9+vbtCyMjIwBAaGgoWzGCv4bcx+m8iWzcuJE8PT3p/v37UtuDBw/ogw8+oA0bNjDT1aFDB5o3bx6dPHmSjIyMKD4+noiIzp49SzY2Nsx0ERGtW7eOLC0tyd/fn4yMjKTjskJCQsjNzY2ptpycHBo+fDjp6elJx+3VqFGDhg0bRtnZ2Uy1CXQfpVJJDx8+lP7P+phEwZ9HLAXLAK9+0ejoaPTt2xfPnj3Dp59+ii1btgAAPv/8cyQnJzPdv+HZK8rrnjlvCD/mX6NBgwbYtGkTPvroIyiVSmRmZorVEB1DLAXLAK9+UU2AevbsWZkl6fHjx8PExIShMr69oocOHdLaM+/evTs2bdqEHj16MFTGF8KP+deYMGECPv74Y2mLoUGDBpXeKw4v4BMRWGWA14zHFy9egIikoHr37l38/PPPaNmyJbp3785UG89eUV73zHlD+DH/GosWLcKQIUNw+/Zt9O7dGyEhIbCwsGAtS/BnYLwU/UaQnp5O9+7dk96fP3+epk2bRhs3bmSoiqhbt260fv16IiJ6+vQp1a9fn2xtbcnIyIjWrVvHVNuWLVvIxsaGdu3aRaamprRz507y9/eX/s8SXvfMBf88Fi1aRHl5eaxlCP4kYo9VBnj1i1paWuLEiRNo1aoVgoODsWbNGsTFxeGnn37CwoULkZSUxESXBl69orzumfOG8GMK3lTEUrAMXL16FR06dAAA/Pjjj2jTpk0ZvyirwJqfny/VbY2IiEC/fv2gVCrxr3/9C3fv3mWiqTQ81lcG+N0z541atWpJ+6fm5uZiL/Uv8PjxYyxcuBBRUVF4+PChVLlNw5MnTxgpE1SFCKwywKtf1N7eHv/973/Rt29fhIeHY8aMGQBK/Jnm5ubMdJWGR68or3vmvCH8mP87w4cPR0pKCsaMGYP69euLHye6Auu16DcBXv2ie/bsIX19fVIqleTp6Sm1BwQEUI8ePZjpIuLbK8rrnjlvCD/m/07NmjWlvxcC3UEcdC4Dy5cvx8aNG+Hm5oahQ4firbfeAgAcOHBAWiKWk9TUVBARBgwYgPT0dFy8eBHh4eHS9a5du2LVqlWy6yrN2LFjcf78eRw6dAjZ2dnIycnBL7/8gosXL2LcuHFMtXl7e0sZrxkZGfD09ERsbCw+//xzLFmyhKk2nrCyssK5c+cAAEQkZlt/AUdHR7x48YK1DMGfhXVkf1MoKiqiJ0+elGlLS0tj8iu+/Oxh0KBBlJGRIbuOqjAxMaFTp05ptZ88eZJMTEwYKPodCwsLSk5OJiKiwMBA6ty5MxERhYeHU9OmTVlK4wo/Pz9SKBSkVCr/8CWomNjYWPLw8KDo6GjKysqinJycMi8Bn4g9VhngzS9K5RLBDx8+jKVLl8quoyp49oryumfOG8KP+b9jYWGBnJwceHh4lGmn/18BEAUi+EQEVhn4+OOP0a9fP0yYMAHZ2dno2LEj9PX1kZWVhW+++QYTJ05kLZE75s+fj5kzZ2Lr1q1o2LAhgJJl1zlz5mDBggVMtbVq1QobNmxAr169cPToUXz55ZcAgPv376Nu3bpMtfGGo6MjHB0d4efnh4EDBzKv6KVrDBs2DAYGBtixY4dIXtIhhI9VBnjzi+rp6SEjI0PKsDUzM8OVK1e0DqFmCc9eUZ5rLAv+WZiYmCAuLg4tWrRgLUXwJxAzVhngzS9KRBg5cqS0nFlQUIAJEybA1NS0zH0sAwTPXlGeayzzivBj/jXat2+Pe/fuicCqY4jAKgO8+UU//fTTMu+HDx8uu4Y/gmevKG975rqA8GP+NaZMmYJp06Zhzpw5aNOmDfT19ctcb9u2LSNlgqoQS8EysHfvXnh7e6O4uBgeHh44evQoAGDp0qU4efIkjhw5wlghf9y7dw8KhQK2trYAgNjYWOzYsQNOTk4YP348U20ffPBBmT1zR0dHsWf+B5iZmeH06dOS1UzweiiV2o5IhUIhkpc4R/hYqxFd8IvyCs9e0cuXL+P9998HUPKjqX79+rh79y62bt2KoKAgptp4Rfgx/xppaWlar9TUVOlfAacwsvm8EeiCX5RXePaKGhsb0927d4mIaODAgbRo0SIiKqnIZGxszFIatwg/puBNQsxYqxGqwC/K+pBuXYFnr6hmz/zevXsIDw/HBx98AICvGsu8UdqPWa9ePdSuXRu1a9eGhYUFc18y72zbtg1dunSBtbW1lOy4evVq7N+/n7EyQWWIwCrgEo1X9NSpUzh69Ch69OgBgA+v6MKFCzF79mw0adIEHTp0QKdOnQCUZHw7Ozsz1cYrpf2Yx48fR2RkJCIjIxEVFYXIyEjW8rhl/fr1mDlzJnr27Ins7GxpT9XCwgKrV69mK05QOaynzP9kShchJyopqJ2amspQke4QFRVFFhYWpFQqadSoUVL7Z599Rn379mWiKSUlhdRqNRGVHGx++fJlKi4ulq6fP3+ekpKSmGjjHWNjY2lpX/D6tGzZkn7++WciKvn7kZKSQkREiYmJVLduXYbKBFUh7DbVCOmAX5RXePSKOjg44MGDB6hXrx4aNGiAadOmISgoCPXr1wcAJgcq6ArCj/nXSEtLq3AVxNDQUGwrcYwIrNWILvhFeYVHryjpQI1lXhF+zL9G06ZNER8fDzs7uzLtR44cQcuWLRmpEvwRIrBWIyEhIawl6CyivvI/i8GDBwMARo8eLbUJP+YfM2fOHPj4+KCgoABEhNjYWOzcuRMBAQHYvHkza3mCShCBVcAlly9fljy+Gq9o6frKLAKrQqHQqhgkKgi9Hmlpaawl6CSjRo1CUVER5s6di/z8fHh7e8PGxgZr1qyRvNQC/hCVlwRcYmJiguTkZDRu3BiDBg1Cq1at4OfnJ+3T5efny65JqVTCy8tL2jM/ePAgPDw8xJ65QBaysrKgVqtRXFyMgIAABAcHi6IbnCLsNgIu4dEr+umnn6JevXqoVasWatWqheHDh8Pa2lp6r3kJKkb4MV+f7OxsDBs2DFZWVrC2tkZQUBDq1KmDb7/9Fvb29jh37px0qpKAQxhmJAsElbJnzx7S19cnpVJJnp6eUntAQAD16NGDoTLBX2HdunVkaWlJ/v7+ZGxsLNlGQkJCyM3NjbE6/pg4cSLZ2trSrFmzqFWrVqRUKsnLy4vc3d0pOjqatTzBHyCWggVckZqaiqZNm0KhUCAjIwMPHjzAW2+9JRUjj42Nhbm5ORwdHRkrFfwZnJycEBAQgD59+sDMzAwJCQlQqVS4evWqZK0S/I6dnR02b94MT09PpKamwt7eHlOnThVFIXQEsRQs4AoHBwc8evQIANCgQQMsW7ZMeg+UeEVFUNU9hB/zz3H//n04OTkBAFQqFYyMjDB27FjGqgSviwisAq4ov4Ai6iv/M9D4Mcsj/JgVo1ary3h99fT0tJLkBPwi7DYCgaDaEX7MPweJqm06jQisAq4QXtF/JsKP+ecQVdt0G5G8JOAK4RX95yP8mIJ/OmKPVcAVwiv6z0L4MQVvImLGKhAIqo1Jkybh4MGDGDx4MMLCwpCUlITu3bujoKAAfn5+cHV1ZS1RIPjbEYFVIBBUG8KPKXgTEYFVIBBUG/r6+rh79y6sra0BlNSAjo2NRevWrRkrEwiqD7HHKhAIqg3hxxS8iQi7jUAgqDaEH1PwJiICq0AgqDaEH1PwJiL2WAUCgUAg+BsRe6wCgUAgEPyNiMAqEAgEAsHfiAisAoFAIBD8jYjAKhAIBALB34gIrAKBQCAQ/I2IwCoQCAQCwd+ICKwCgUAgEPyN/B9f9Noh0CmN1gAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "single_test_case.plot.bar(subplots=True, \n", " figsize=(5,15), \n", " title=['' for i in range(len(single_test_case.columns))])\n", "plt.show()" - ] + ], + "outputs": [] }, { "cell_type": "markdown", @@ -915,43 +204,31 @@ "execution_count": 10, "id": "b4ab78a8-5abd-4e23-8ef0-c1ca4386fc7d", "metadata": {}, - "outputs": [], "source": [ "# Get the results for a single parameter setting\n", "rowindex = 1\n", "single_time_result = time_remote_results.iloc[rowindex].dropna()\n", "test_case_params = time_remote_results.index[rowindex]" - ] + ], + "outputs": [] }, { "cell_type": "code", "execution_count": 11, "id": "034afd07-3c30-49dc-b1cd-e93068d71034", "metadata": {}, - "outputs": [], "source": [ "# Simplify the index by removing redundant text\n", "single_time_result.index = [ v.replace(\"time_remote_file_reading\", \"\")\n", " for v in single_time_result.index ]" - ] + ], + "outputs": [] }, { "cell_type": "code", "execution_count": 12, "id": "a03e720c-ed74-4718-8506-a1bfb182a161", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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atTILF261EybNs1ky5bNFC1a1Fy/ft1u3nbt2hlvb28zfPhws2rVKtOzZ09jsVjM4MGD7eaLiIgwzZo1M99//72Jjo423377rcmePbsJDw83p0+ftpu3cePGJjQ01Pz0009m/fr15vDhw8YYY0qUKGHy5ctnFi5caNavX29OnTqVrH1FlSpVTJEiRR5qnRjzf8e17777zla2bNky4+bmZqpWrWrmzp1rli1bZrp06WIkmbfeeuuhvufeXMUYY/e9OXPmTNL5+qRJk0zGjBnNv//+m+wYkpz43utxHJSd6bfffjOSzMyZMx/ZZz5M4nzr1i2TLVs207NnT7vy9Jz4zpo1y3h6eprz58/blderV880adLkge9PTYnvo3bz5k1z69atJM3ranX2bu+//76RZA4ePOjsUOCCChcubN59911jTNpOfO/dl06bNs1IMhs3bnyk35OQ4cOHm7CwMNvJWsWKFU3OnDntTt7i4+NNwYIFTbFixR7qOz7//HPj5uZm1q9fn6T5nbE+xo0bZySZ5cuX25UPGTLESHqomwbHjx83GTJkMB07dnzgfO7u7qZLly525dOnTzeSzNixY21l//77r/Hx8TGvv/663byDBw82FovF/Pnnnw+M68yZMw5lly9fNlmyZEkzFyr/97//GX9/fzN58uQHJr4NGjQwDRs2TFbd3b17t5Fkevfufd/5rly5Yvz9/U2lSpWS9LkffvihkWQOHDhgV/76668bSXbnU9myZXP43GvXrpmgoCCHJPm/xDVp0iQjyYwfPz5Jy/Bf4kpMmTJlTOHChe3Om9auXWskmW+++cZW9scffxiLxWKGDBli9/727dsbX19fc+7cOVtZQr/zzZs3G0lm4MCBduV58+Y1devWdZjfw8PDof4mZ1/xOBLfZs2aGW9vb7ubcMYYU6tWLRMYGPhQ3/OoEt8bN26YkJAQh4sQSfFY+vgm1NTZYrHozTff1HfffacCBQrI19dXpUuX1oYNG2SM0SeffKLcuXPL399fzzzzjA4cOODwucuXL1f16tUVGBgoPz8/VaxYUStWrLCb559//tHrr7+uyMhIeXt7K3PmzKpYsaKWL19+33grVaokSXr55ZdlsVjsbsXPmzfP1iwiICBANWvW1Pr16+0+o1+/frJYLNq2bZuaNGmijBkzKk+ePMlcc3e+68SJE2revHmy35uY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2U6SjDHm4MGD5tVXXzVZsmQxFovF7rsSaoFy+/Zt06BBAxMQEGC2b99uK7euu3sTPWOMqVu3rsmSJYvt7+Rs4xUrVpjq1aubwMBAu9gk2Q3IUaVKFdvFlu+++84EBwebf//91+5uV+7cue32WwMGDDAWi8V07NjRLF68ONELAvcqX768yZ8//33neemll0yGDBkcTt7OnDljS8qt/stxx5g721CS3QU562/jzTffdIjNepfWerHx3sQ3udvyfvs0a/KS1HqT0L40oUQvqcfb2NhY4+7uft8TQKunn37atGrVyq5s0aJFxt/f37Ru3dosWrTINnCKh4eHmThxot28SfmtWi80enl52S4aGXMnYSxVqpTJnj17qlgf58+fN2XKlDFFihQx33//vfn111/NN998Y8LDw02tWrXsLg6cOXPGvPHGGyZ79uzGzc3NbrnvPobny5fPSDJDhw61+y7rxZy7E4XKlSubwMBAM2vWLHPhwgWzdu1aky9fPuPu7m63j2jfvr3DPsMqf/78pnbt2rb1e+96SYz1jvqXX35pV27ty7h582aHz3r55ZdtreCsdffefpd3S85xyJogWV/W48fFixdNtmzZzEcffWT73MQS3//973/Gy8vL7tzmQYnv1q1bzfr16820adPMk08+abJkyWI7jibk3XffdfhdGnP/dX/o0CGTN29eU7FiRVtrsuHDh5vAwEDTpk0bu8+ZOHGi7SL28uXLzcKFC80rr7xi/Pz8zOLFi5Md171u3bplsmbNmmAfVGuSZH3dfaMmOXHNmjXLVKhQwWTIkMGuntz9G7Ymvhs2bHCI4/XXX7e70FOzZk27c4K7eXl5JZrsX7t2zdSoUcP4+fkl+D3JSXyTs6+oUqWKCQgIcPhc6+926tSpxpg7x8/7zXf3uemWLVtMWFiYadiwoZk/f75ZuXKl+eijj+wuhltt27bNNGzY0ISEhDjsoxNaD4/CpUuXjCS7epoUKfoc35CQELu/rX0MEiu/fv26pDtDyUtSkyZN5OnpafcaNmyYjDE6f/68pDv9DVq2bKnx48erfPnyCgkJUYsWLZI0dPq9rMOFh4eHO0yLiIhQfHy8wyMAEpo3Oa5du/bAPhXJERoaave3t7e37XsehaxZsyZYZl13QUFBWr16tUqUKKEPPvhARYoUUUREhPr27fvAtv+3bt3S/PnzHfrW/fLLL7p165aeffZZW9m5c+fk4eHhsLwJxdetWzf17t1bjRs31vz587Vx40Zt3rxZxYsXT3C9PGgdWpc1sXXxIMmN597f2D///CNJyp49+wO/y8/Pz+H35e3tbatriQkJCdGzzz6rKVOm2PqLTJo0SWXLllWRIkUk3VkPt2/f1pdffulQT619yu7tm3a3ypUra+7cubp9+7ZatGih7Nmzq2jRopoxY4bDvBkzZlTp0qVVrVo1ffDBBxo7dqzmzZvn0KfnXp999pk6duyop556SrNnz9aGDRu0efNm1alTJ8F1/bD7rCtXrujpp5/Wxo0bNWjQIEVHR2vz5s2aM2eOpITrX4cOHbR48WL973//U4kSJWzlD9oP3ftYg6Rs402bNqlWrVqSpHHjxmnt2rXavHmzPvzwQ4f4atSooQ0bNig2NlbLly/XM888o9DQUD355JNavny5Dh06pEOHDqlGjRq29/Tq1UsjRozQhg0bVLduXYWGhqp69erasmWLwzLc7Z9//nng7/jcuXPKmjWrQx/osLAweXh4OKyPh92GkvS///1PYWFhtjEg7pZYfb9586auXLmSaOxS0rfl/fZp1nmTUm8S25cmJKnH2wsXLiguLu6B2+v06dNau3at3XcbY9SmTRtVrlxZEydOVJ06dVSjRg2NGjVKTZs2VZcuXWx94ZP6W7Wup4IFCypnzpy277JYLKpdu7aOHz9u64fvzPUxbNgw7dixQ8uWLVPTpk319NNPq2PHjvr++++1dOlSff/995Lu9CGvVauW5syZo/fff18rVqzQpk2bbGN03F1Hrcteu3Ztu++qW7euJGnbtm22sh9//FEVK1bUSy+9pIwZM6patWp6/vnnVaJECWXLls3uM69fv+7Qn1y60/fVWn9Wr17tsF4SenxX//79NWjQIA0ePFhvvvlmguu4TJkyDp81c+ZM23EjKce65ByH8uTJYzd9wIABkqQPP/xQnp6eevPNN3Xx4kVdvHjRVqevXr2qixcvyhijK1euqHPnzurSpYsiIiJs8968eVPSnfEKEnrMXqlSpVSuXDk1a9ZMq1atkjFGH3zwQYLLc+vWLU2ZMkXFixdX6dKl7abdb9337NlTMTExWrJkiV544QVVrlxZ7733nkaOHKmJEydq9erVkqQLFy6oc+fOateunUaMGKHq1aurbt26mjFjhsqUKaMOHTokO657LVy4UKdPn06wH3CbNm3s4q9evXqy45ozZ45eeuklZcuWTdOmTdP69eu1efNmtWnTxm5/bq0nCT027O7ftHXehOaLjY3VzZs3HY4fknTjxg0999xz+u233zRv3jw99dRT910vD5LUfYVVlixZHD7j3uPFuXPn7jvf3Tp37qwsWbLop59+UoMGDVStWjUNHDhQPXv2VL9+/Wzj+Rw9elRPP/20Tpw4oS+++EJr1qzR5s2bbX3qH1W+cS/reU5yP//+velTiUyZMkm68zy5xAatsG7ITJkyaeTIkRo5cqSOHj2qefPmqWfPnjp79qxdZ/SksFaShJ7FdfLkSbm5udkNuCTJ4WQsuTJlymRL4tOChC4onD59Wnnz5rX9HRUVpR9++EHGGP3++++aNGmSBgwYIF9fX/Xs2TPRz16+fLkuXbqk5557zq48ocGuQkNDdfv2bZ07d87uRDGh+KZNm6YWLVpoyJAhduX//vuvbdCA5LB+X2Lr4kHPtE5uPPf+xqyDYyR1sLCH1bp1a/34449atmyZcuTIoc2bN2v06NG26RkzZpS7u7uaN2+uzp07J/gZuXPnvu93NGrUSI0aNdKNGze0YcMGDR06VE2bNlWuXLlUvnz5RN9XtmxZSUpwMLO7TZs2TVWrVrWLW5IuX7583/cl18qVK3Xy5ElFR0erSpUqtvLEngnar18/jR8/Xt99953tJN/qQfsh6/4xOX744Qd5enpqwYIFdklyQgPWVK9eXb1799avv/6qFStWqG/fvrbypUuX2rap9YRFupOwdevWTd26ddPFixe1fPlyffDBB6pdu7aOHTsmPz+/BOPKnDnzA3/HoaGh2rhxo4wxdnXh7Nmzun379kOtj8TMnj1bjRs3lru7u8O0xOq7l5dXos/fTe62vN8+7e6yB9WbxPalCUnq8TYuLk7u7u4P3F4//fSTMmTIoJo1a9rKzpw5o1OnTumNN95wmL9MmTKaMmWKDh8+rCJFiiT5t5onT55Ef1fm/w9+Yh1Iy5nrY8eOHcqWLZvDxY8yZcpIkv744w/bvzt37tSkSZPUsmVL23wJDcBWrFgxu0Erre5dbunOBaKFCxfq7NmzOn36tHLmzClfX1998803atKkiW2+qKgoSdKuXbvsTuBPnz6tf//91/bM0CeffFKbN2+2+96IiAi7v/v3769+/fqpX79+CSZ41nX8v//9z+6ixb2ScqxLznFo/vz5doOwWeP+448/dPjw4QSTAeu2uHDhgi5evKgzZ87o008/1aeffppgLI0aNbrvQGABAQEqWLBgoseuBQsW6OzZs+rdu7fDtPut+x07dqhw4cLKkCGD3fS7f2dVqlTR3r17de3aNVv53UqXLq3Vq1frypUrDvu0+8V1rwkTJsjLyyvBQVv79etndyEkICBAkpIV17Rp05Q7d27NnDnT7phw7wB71t/srl27HAZ427Vrl91zcK3nradPn7b7HVgHHb33mbk3btxQ48aNtWrVKv388892x8OHldR9hZX1AtLd7j1ehIaGatOmTYnOd+/3v/rqqw7HvzJlyig+Pl579uzRE088oblz5yo2NlZz5syxq787duxIwlI+PGuulNxjfore8X1YFStWVHBwsHbv3q3SpUsn+Lp7hDqrHDly6M0331TNmjXtrngmVYECBZQtWzZNnz7dbtSw2NhYzZ492zbS86NUsGBBHTx48JF+5oPc7y6wt7f3fa+m3HvFad26dTpy5IjDA6qlOwlb8eLF9fnnnys4OPiB22T27NkqV66c3VXo69eva+HChQ5X6qtVq5ZgPNOnT08wDusyW/3yyy86ceLEfeNJTLly5eTj45PouniQ/xpPhQoVFBQUpDFjxiR/dLtkqFWrlrJly6bvvvtO3333nXx8fPTqq6/apvv5+alatWravn27ihUrlmA9vffuVWK8vb1VpUoVDRs2TJISHNnzbqtWrZIkuwsuCUloXf/+++8Oo7T/V9aD773f9e233zrMO2HCBPXv318DBgywG0XWqnz58vL19dW0adPsyo8fP66VK1c+1AHWYrHIw8PD7oB27do1TZ061WHesmXLKjAwUCNHjtTp06dtCUyNGjW0fft2zZo1S4ULF3Y42bUKDg5WkyZN1LlzZ50/fz7Bu0FWdevW1b59+7Ry5cpE56levbquXLnicDI5ZcoU2/RH4dixY9q8eXOidwXnzJljdzfh8uXLmj9/vp5++ukEE2Xp4bZlYvu0hPaxidWbhPaliUnq8dbX11dVqlTRjz/+eN+WHLNnz1aDBg3s6kLGjBnl4+OTYLK2fv16ubm52U72kvpb9fDwUKNGjbRnzx6735gxRosXL1aePHlsJ0jOXB8RERE6fvy4w/7dug+y3s1Mzj7E+hu990kCCxculKQEE/awsDAVK1bMduyIjY21S0Dq1KkjHx8fuycQSP/3RIfGjRtLupOo3O98bODAgerXr58++ugj20Wze9WuXVseHh46ePBgoutYkvLnz688efJo4sSJDkmNVXKOQ1FRUXbl1n3YyJEjtWrVKrvX559/LulOorZq1Sr5+/sra9asDvOtWrVKtWvXlo+Pj1atWqVBgwYlGKfVv//+q127diV67JowYYJ8fHzUrFkzh2n3W/cRERH6888/HVqf3Ps7sy7zvXXRGKMNGzYoY8aMDsnzg+K62+nTp7Vw4UI1btw4weN/rly57OIvUKBAsuOyWCzy8vKyS3pPnz7t0AIsW7ZsKlu2rKZNm2Y30vGGDRu0d+9ePf/887ayRo0ayWKxaPLkyXafMWnSJPn6+qpOnTq2Muud3pUrV2r27NkOLS8eVlL3FVaXL1+2e8KGdOd44ebmpsqVK0u6c66c2HwJff+WLVscRoVOyr7KGKNx48YlbUEfkvWOc+HChZP1vjRxx9ff319ffvmlWrZsqfPnz6tJkyYKCwvTP//8o507d+qff/7R6NGjdenSJVWrVk1NmzZVwYIFFRAQoM2bN2vx4sV2P+ikcnNz0/Dhw9WsWTM1aNBAb7zxhm7cuKFPPvlEFy9e1Mcff5ykz5kyZYratGmjiRMnqkWLFvedt2rVqhowYICuXr36yJPqxFiv7A4bNkx169aVu7u7ihUrJi8vL0VFRSk6Olrz589XeHi4AgICbDsmSdqyZYvatWunF198UceOHdOHH36obNmyqVOnTpLuXBX85ptv1LhxYz3xxBMyxmjOnDm6ePGi3R2AAQMGaMCAAVqxYoWqVKmiuLg4/fzzzw53hBcvXqyrV6/aDrpWtWrVUuXKlfX+++8rNjZWpUuX1tq1axM8kW/QoIEmTZqkggULqlixYtq6das++eSTJDUVTkjGjBn17rvvatCgQXbrol+/fklq6vxf4/H399enn36qdu3aqUaNGmrfvr2yZMmiAwcOaOfOnfrqq68earnu5e7urhYtWuizzz5TYGCgnn/+eYdh9r/44gtVqlTJ1iQnV65cunz5sg4cOKD58+fbJTQeHh6qUqWK7ZEgffr00fHjx1W9enVlz55dFy9e1BdffCFPT0/bXdNvv/1Wa9asUa1atRQZGanY2FitWbNGX375pSpUqKBGjRrZPj+hetegQQMNHDhQffv2tV3tHjBggHLnzq3bt28/kvUk3bkYkTFjRnXo0EF9+/aVp6envv/+e+3cudNuvvXr16tDhw6qWLGiatas6XCQL1eunIKDg9W7d2998MEHatGihV599VWdO3dO/fv3l4+PT6Ink/dTv359ffbZZ2ratKlef/11nTt3TiNGjHA4yZbubPcqVapo/vz5yp07t+0xbRUrVpS3t7dWrFiht956y+49DRs2VNGiRVW6dGllzpxZR44c0ciRI5UzZ07ly5dP0p1metWrV1efPn3Up08fSVLXrl01c+ZMNWrUSD179lTZsmV17do1rV692tbUqkWLFvr666/VsmVLHT58WFFRUfrtt980ZMgQ1atXz67J9X8xe/ZsBQcH2y6qJbReatasqW7duik+Pl7Dhg1TTEyM+vfvn+hnJndbenl56dNPP9WVK1dUpkwZrVu3ToMGDVLdunVtza8fVG8S25cmJqnHW+lO14FKlSrpqaeeUs+ePZU3b16dOXNG8+bN07fffqubN29q9erV+uGHH+y+w9vbW506ddJnn32mFi1a6OWXX5a7u7vmzp2r6dOnq23btramhMn5rQ4cOFCLFi1SnTp11K9fPwUGBmr8+PHauXOnZs2aJUlOXR8BAQHq3Lmzvv/+e9WsWVM9e/ZUZGSk/vjjDw0aNEhZsmSxJRIFCxZUnjx51LNnTxljFBISovnz52vZsmUOMdaqVUsNGzbUgAEDFB8fr3LlymnLli3q37+/GjRoYNdU33oymidPHl28eFGLFi3ShAkTNGTIEJUqVco2X0hIiD766CP17t1bISEhqlWrljZv3qx+/fqpXbt2STrZ/PTTT9WnTx/VqVNH9evXT3D/Jt1JfgYMGKAPP/xQf//9t+rUqaOMGTPqzJkz2rRpkzJkyGCrV19//bUaNmyocuXK6Z133lGOHDl09OhRLVmyxHaRKDnHoYTc3dXkXkWKFLFddPLw8EjwAtSkSZPk7u5uN+3SpUuqWbOmmjZtqnz58snX11f79u3TF198oRs3biS4Hz958qQWL16sl19+2aF14YN07dpVjRs3Vs2aNfXOO+8oU6ZMttYghQsXtjWDz5Ejh55//nmNHTtW3t7eqlevnm7cuKHJkydr7dq1GjhwoEMrs+TENXnyZN2+fTvJj2GySk5cDRo00Jw5c9SpUyc1adJEx44d08CB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4zVr1iy98847atOmjZYuXaodO3aodevWunnzpt1nnD17Vnv37pW7u7v279//+BcCAAAAaQp3fAGkWmvWrFGFChXUqVMnW9nBgwcd5mvTpo2KFi2q9u3bq23btqpevboKFy6ckqECAAAgFSPxBZBq5c2bV1OmTNGSJUuUO3duTZ06VZs3b1bu3Llt83z99ddav369fv/9d0VGRmrRokVq1qyZNm7cKC8vLydGDwAAgNSCxBdwIa42qmuHDh20Y8cOvfzyy7JYLHr11VfVqVMn2+OO/vrrL7333nuaMGGCIiMjJd1JhIsXL67evXtr2LBhzgwfAAAAqYTFGGOcHQQAezExMQoKCtKlS5cUGBhoN+369es6dOiQcufOLR8fHydFiHuxXfA48TgjIG243/EbgHMxuBUAAAAAwKWR+AIAAAAAXBqJLwAAAADApZH4AgAAAABcGokvAAAAAMClkfgCAAAAAFwaiS8AAAAAwKV5ODsAAAAA4GE86BnXPN8agBV3fAEAAAAALo07voAr6ReUgt91KeW+K5mqVq2qEiVKaOTIkZKkXLlyqWvXruratatT4wIAAIBzkPgCcHmbN29WhgwZnB0GAAAAnITEF4DLy5w5s7NDAAAAgBPRxxdAiqlataq6dOmirl27KmPGjMqSJYvGjh2r2NhYtW7dWgEBAcqTJ48WLVpke8/u3btVr149+fv7K0uWLGrevLn+/fdf2/TY2Fi1aNFC/v7+Cg8P16effurwvbly5bI1e5akzz77TFFRUcqQIYMiIyPVqVMnXblyxTZ90qRJCg4O1pIlS1SoUCH5+/urTp06OnXq1ONZMQAAAHisSHwBpKjJkycrU6ZM2rRpk7p06aKOHTvqxRdfVIUKFbRt2zbVrl1bzZs319WrV3Xq1ClVqVJFJUqU0JYtW7R48WKdOXNGL730ku3z3nvvPa1atUo//fSTli5dqujoaG3duvW+Mbi5uWnUqFH6448/NHnyZK1cuVLvv/++3TxXr17ViBEjNHXqVP366686evSo3n333ceyTgAAAPB40dQZQIoqXry4PvroI0lSr1699PHHHytTpkxq3769JKlPnz4aPXq0fv/9dy1cuFClSpXSkCFDbO+fOHGiIiMjtW/fPkVERGjChAmaMmWKatasKelOYp09e/b7xnD3IFe5c+fWwIED1bFjR33zzTe28lu3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esqdO7e2bNmiTJkyJTovUsa0adPUunVrPf/886pYsaKMMVq3bp1++uknTZo0SU2bNnV2iABSAIkvkI40adJEpUuXdujT9Mknn2jTpk368ccfnRRZ8lSpUkVt2rRxaPI4bdo0jR8/XtHR0c4JLAlef/11TZkyReHh4bamkImNKpoWmhEOHTpUWbJkUZs2bezKJ06cqH/++SfNPAbl6aefVt68eTVu3Dh5eNwZ/uL27dtq166d/v77b/36669OjvDB0nK9uFuxYsX08ccfOzyWafHixerRo4d27tzppMgebOzYserSpYtu376d6DxpqRuAqxwzChUqpNdff13vvPOOXflnn32mcePGac+ePU6KDEBKIvEF0pHMmTNr5cqVioqKsivftWuXatSooTNnzjgpsuQJDAzUtm3bHEYSPnDggEqXLq2LFy86J7AkWrx4sQ4cOKC33npLAwYMUEBAQILzvf322ykcWfLlypVL06dPV4UKFezKN27cqFdeeUWHDh1yUmTJ4+vrq+3btzuM8Lp7926VLl1aV69edVJkSZfW64WVr6+v9uzZ43CH+vDhwypSpIhiY2OdE1gSXb58WUeOHFGxYsW0fPnyRLsyFC9ePIUjSz5XOWZ4e3vrzz//TLBuFC1aVNevX3dSZABSEqM6A+nIlStX5OXl5VDu6empmJgYJ0T0cCwWiy5fvuxQfunSpTRxF6VOnTqS7owY/Pbbbyea+KYFp0+fVnh4uEN55syZderUKSdE9HACAwN19OhRh8T32LFjaWb7pPV6YRUUFKS///7bIfE9cOCAMmTI4JygkiEgIEBFixbVd999p4oVK9pGEE6LXOWYERkZqRUrVjgkvitWrFBkZKSTogKQ0tLWUIMA/pOiRYtq5syZDuU//PCDChcu7ISIHs7TTz+toUOH2p3Mx8XFaejQoapUqZITI0ue7777Ls0kVYmJjIzU2rVrHcrXrl2riIgIJ0T0cF5++WW1bdtWM2fO1LFjx3T8+HH98MMPateuXap+nNHdXKVePPvss+ratasOHjxoKztw4IC6d++uZ5991omRJU/Lli1tSe+VK1cUExNj90oLXOWY0b17d7311lvq2LGjpk6dqmnTpqlDhw56++239e677zo7PAAphDu+QDrSu3dvvfDCCzp48KCeeeYZSXeueM+YMSPN9NWSpOHDh6ty5coqUKCA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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ "temp = pd.DataFrame.from_dict({'max': [np.max(v) for k ,v in single_time_result.items()],\n", " 'median': [np.median(v) for k ,v in single_time_result.items()], \n", @@ -959,31 +236,32 @@ "temp.index = single_time_result.index\n", "temp.plot.bar(title=f\"Times for: {test_case_params}\")\n", "plt.show()" - ] + ], + "outputs": [] }, { "cell_type": "code", "execution_count": null, "id": "6fd946d2-42b2-4631-9674-b12dc8f56b54", "metadata": {}, - "outputs": [], - "source": [] + "source": [], + "outputs": [] }, { "cell_type": "code", "execution_count": null, "id": "bfb97602-3943-4cd5-ab47-e0a5a8216b9e", "metadata": {}, - "outputs": [], - "source": [] + "source": [], + "outputs": [] }, { "cell_type": "code", "execution_count": null, "id": "0ca15a55-e77c-40ba-b789-dc95e4c4f23e", "metadata": {}, - "outputs": [], - "source": [] + "source": [], + "outputs": [] } ], "metadata": { From cc5fb738af4edfcf86f750c4cce7d477aa7594f9 Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sat, 18 May 2024 16:22:12 -0400 Subject: [PATCH 15/20] debug multiparams --- src/nwb_benchmarks/core/_base_benchmark.py | 1 + src/nwb_benchmarks/setup/_reduce_results.py | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/nwb_benchmarks/core/_base_benchmark.py b/src/nwb_benchmarks/core/_base_benchmark.py index a21966f..840bace 100644 --- a/src/nwb_benchmarks/core/_base_benchmark.py +++ b/src/nwb_benchmarks/core/_base_benchmark.py @@ -17,6 +17,7 @@ class BaseBenchmark: parameter1=value1, parameter2=value2, ... + ), ParameterCase2=dict( parameter1=value3, parameter2=value4, diff --git a/src/nwb_benchmarks/setup/_reduce_results.py b/src/nwb_benchmarks/setup/_reduce_results.py index 311d425..b52677b 100644 --- a/src/nwb_benchmarks/setup/_reduce_results.py +++ b/src/nwb_benchmarks/setup/_reduce_results.py @@ -43,27 +43,31 @@ def reduce_results(raw_results_file_path: pathlib.Path, raw_environment_info_fil reduced_results = dict() for test_case, raw_results_list in raw_results_info["results"].items(): - if len(raw_results_list) != 12: # Only successful runs results in this length + + # Only successful runs have a results field of length 12 + if len(raw_results_list) != 12: continue flattened_joint_params = collections.defaultdict(list) - for param_types in raw_results_list[1]: # Will naturally iterate in correct order - for param_value_index, param_value in enumerate(param_types): - flattened_joint_params[param_value_index].append(param_value) + for parameter_names in raw_results_list[1]: + for parameter_value_index, parameter_value in enumerate(parameter_names): + flattened_joint_params[parameter_value_index].append(parameter_value) serialized_flattened_joint_params = [ str(tuple(joint_params)) for joint_params in flattened_joint_params.values() ] - assert len(serialized_flattened_joint_params) == len(raw_results_list[11]), ( + # Skipped results in JSON are writen as `null` and read back into Python as `None` + non_skipped_results = [result for result in raw_results_list[11] if result is not None] + assert len(serialized_flattened_joint_params) == len(non_skipped_results), ( f"Length mismatch between flattened joint parameters ({serialized_flattened_joint_params} and result " - f"samples ({len(raw_results_list[11])}) in test case '{test_case}'! " + f"samples ({len(non_skipped_results)}) in test case '{test_case}'! " "Please raise an issue and share your intermediate results file." ) reduced_results.update( { test_case: { joint_params: raw_result - for joint_params, raw_result in zip(serialized_flattened_joint_params, raw_results_list[11]) + for joint_params, raw_result in zip(serialized_flattened_joint_params, non_skipped_results) } } ) From 4c293c783a25f7e07880474d81b2b0873563e06a Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sat, 18 May 2024 21:50:43 -0400 Subject: [PATCH 16/20] debug multiparams --- .../benchmarks/time_remote_slicing.py | 16 +++++----- src/nwb_benchmarks/setup/_reduce_results.py | 29 +++++++++++-------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py index 15b44b5..ee7cf98 100644 --- a/src/nwb_benchmarks/benchmarks/time_remote_slicing.py +++ b/src/nwb_benchmarks/benchmarks/time_remote_slicing.py @@ -33,14 +33,14 @@ object_name="TwoPhotonSeries", slice_range=(slice(0, 3), slice(0, 796), slice(0, 512)), ), - # IcephysTestCase=dict( - # s3_url=get_s3_url( - # dandiset_id="000717", - # dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.nwb", - # ), - # object_name="data_00002_AD0", - # slice_range=(slice(0, 30_000),), - # ), + IcephysTestCase=dict( + s3_url=get_s3_url( + dandiset_id="000717", + dandi_path="sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.nwb", + ), + object_name="data_00002_AD0", + slice_range=(slice(0, 30_000),), + ), ) zarr_parameter_cases = dict( diff --git a/src/nwb_benchmarks/setup/_reduce_results.py b/src/nwb_benchmarks/setup/_reduce_results.py index b52677b..71c8629 100644 --- a/src/nwb_benchmarks/setup/_reduce_results.py +++ b/src/nwb_benchmarks/setup/_reduce_results.py @@ -8,6 +8,7 @@ import shutil import subprocess import sys +import warnings from typing import Dict, List @@ -58,19 +59,23 @@ def reduce_results(raw_results_file_path: pathlib.Path, raw_environment_info_fil # Skipped results in JSON are writen as `null` and read back into Python as `None` non_skipped_results = [result for result in raw_results_list[11] if result is not None] - assert len(serialized_flattened_joint_params) == len(non_skipped_results), ( - f"Length mismatch between flattened joint parameters ({serialized_flattened_joint_params} and result " - f"samples ({len(non_skipped_results)}) in test case '{test_case}'! " - "Please raise an issue and share your intermediate results file." - ) - reduced_results.update( - { - test_case: { - joint_params: raw_result - for joint_params, raw_result in zip(serialized_flattened_joint_params, non_skipped_results) + if len(serialized_flattened_joint_params) != len(non_skipped_results): + message = ( + f"In intermediate results for test case {test_case}: \n" + f"\tLength mismatch between flattened joint parameters ({len(serialized_flattened_joint_params)}) and " + f"result samples ({len(non_skipped_results)})!\n\n" + "Please raise an issue and share your intermediate results file." + ) + warnings.warn(message=message) + else: + reduced_results.update( + { + test_case: { + joint_params: raw_result + for joint_params, raw_result in zip(serialized_flattened_joint_params, non_skipped_results) + } } - } - ) + ) if len(reduced_results) == 0: raise ValueError( From 2b359bffe2a1c2061d2ae13f0a85f3422b1d04ca Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sat, 18 May 2024 22:41:54 -0400 Subject: [PATCH 17/20] some results --- ...f3abc58d3f9487dc3b25977d808fc1536e53f.json | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 results/results_timestamp-2024-05-18-21-50-43_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json diff --git a/results/results_timestamp-2024-05-18-21-50-43_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json b/results/results_timestamp-2024-05-18-21-50-43_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json new file mode 100644 index 0000000..6b2a01f --- /dev/null +++ b/results/results_timestamp-2024-05-18-21-50-43_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json @@ -0,0 +1,57 @@ +{ + "version": 2, + "timestamp": "2024-05-18-21-50-43", + "commit_hash": "4c293c783a25f7e07880474d81b2b0873563e06a", + "environment_hash": "91bf3abc58d3f9487dc3b25977d808fc1536e53f", + "machine_hash": "Ackermann", + "results": { + "time_remote_slicing.FsspecNoCacheContinuousSliceBenchmark.time_slice": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 0.577229900052771, + 0.5970238998997957, + 0.5664639000315219 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/38c/c24/38cc240b-77c5-418a-9040-a7f582ff6541'\", \"'TwoPhotonSeries'\", '(slice(0, 3, None), slice(0, 796, None), slice(0, 512, None))')": [ + 1.0336655001156032, + 1.2907407998573035, + 0.9944616998545825 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/c98/3a4/c983a4e1-097a-402c-bda8-e6a41cb7e24a'\", \"'data_00002_AD0'\", '(slice(0, 30000, None),)')": [ + 0.17991229984909296, + 0.2016158001497388, + 0.18414429994300008 + ] + }, + "time_remote_slicing.Ros3ContinuousSliceBenchmark.time_slice": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 0.0035342001356184483, + 0.003450800199061632, + 0.0036127998027950525 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/38c/c24/38cc240b-77c5-418a-9040-a7f582ff6541'\", \"'TwoPhotonSeries'\", '(slice(0, 3, None), slice(0, 796, None), slice(0, 512, None))')": [ + 0.0007092999294400215, + 0.0007117001805454493, + 0.000698799965903163 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/c98/3a4/c983a4e1-097a-402c-bda8-e6a41cb7e24a'\", \"'data_00002_AD0'\", '(slice(0, 30000, None),)')": [ + 6.3811555066292796e-06, + 6.141684663765631e-06, + 6.1631210492300295e-06 + ] + }, + "time_remote_slicing.ZarrContinuousSliceBenchmark.time_slice": { + "(\"'s3://aind-open-data/ecephys_625749_2022-08-03_15-15-06_nwb_2023-05-16_16-34-55/ecephys_625749_2022-08-03_15-15-06_nwb/ecephys_625749_2022-08-03_15-15-06_experiment1_recording1.nwb.zarr/'\", \"'ElectricalSeriesProbe A-LFP'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 1.2064452001359314, + 1.45879239984788, + 1.137998699909076 + ] + }, + "time_remote_slicing.ZarrForceNoConsolidatedContinuousSliceBenchmark.time_slice": { + "(\"'s3://aind-open-data/ecephys_625749_2022-08-03_15-15-06_nwb_2023-05-16_16-34-55/ecephys_625749_2022-08-03_15-15-06_nwb/ecephys_625749_2022-08-03_15-15-06_experiment1_recording1.nwb.zarr/'\", \"'ElectricalSeriesProbe A-LFP'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 1.0744982999749482, + 1.1373234000056982, + 1.347178699914366 + ] + } + } +} From 077a763260080db8d1d054194c3c86900b48050b Mon Sep 17 00:00:00 2001 From: Cody Baker Date: Sun, 19 May 2024 00:12:52 -0400 Subject: [PATCH 18/20] almost full results from slice timings --- ...f3abc58d3f9487dc3b25977d808fc1536e53f.json | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 results/results_timestamp-2024-05-18-22-41-54_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json diff --git a/results/results_timestamp-2024-05-18-22-41-54_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json b/results/results_timestamp-2024-05-18-22-41-54_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json new file mode 100644 index 0000000..44940e4 --- /dev/null +++ b/results/results_timestamp-2024-05-18-22-41-54_machine-Ackermann_environment-91bf3abc58d3f9487dc3b25977d808fc1536e53f.json @@ -0,0 +1,108 @@ +{ + "version": 2, + "timestamp": "2024-05-18-22-41-54", + "commit_hash": "2b359bffe2a1c2061d2ae13f0a85f3422b1d04ca", + "environment_hash": "91bf3abc58d3f9487dc3b25977d808fc1536e53f", + "machine_hash": "Ackermann", + "results": { + "time_remote_slicing.FsspecNoCacheContinuousSliceBenchmark.time_slice": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 0.5770294000394642, + 0.5558074999134988, + 0.5851527999620885 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/38c/c24/38cc240b-77c5-418a-9040-a7f582ff6541'\", \"'TwoPhotonSeries'\", '(slice(0, 3, None), slice(0, 796, None), slice(0, 512, None))')": [ + 1.0202222999650985, + 1.0687915000598878, + 1.1272402999456972 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/c98/3a4/c983a4e1-097a-402c-bda8-e6a41cb7e24a'\", \"'data_00002_AD0'\", '(slice(0, 30000, None),)')": [ + 0.1669504998717457, + 0.15758339990861714, + 0.23897469998337328 + ] + }, + "time_remote_slicing.FsspecWithCacheContinuousSliceBenchmark.time_slice": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 0.46691940003074706, + 0.434342100052163, + 0.42370989988557994 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/38c/c24/38cc240b-77c5-418a-9040-a7f582ff6541'\", \"'TwoPhotonSeries'\", '(slice(0, 3, None), slice(0, 796, None), slice(0, 512, None))')": [ + 0.29375869990326464, + 0.26918979990296066, + 0.286825800081715 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/c98/3a4/c983a4e1-097a-402c-bda8-e6a41cb7e24a'\", \"'data_00002_AD0'\", '(slice(0, 30000, None),)')": [ + 6.63219959654271e-05, + 5.873775452703179e-05, + 6.128844388626707e-05 + ] + }, + "time_remote_slicing.RemfileNoCacheContinuousSliceBenchmark.time_slice": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 0.5421017999760807, + 0.5975515998434275, + 0.6133785999845713 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/38c/c24/38cc240b-77c5-418a-9040-a7f582ff6541'\", \"'TwoPhotonSeries'\", '(slice(0, 3, None), slice(0, 796, None), slice(0, 512, None))')": [ + 0.5068071000277996, + 0.5669373997952789, + 0.5368534000590444 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/c98/3a4/c983a4e1-097a-402c-bda8-e6a41cb7e24a'\", \"'data_00002_AD0'\", '(slice(0, 30000, None),)')": [ + 6.4188481480264605e-06, + 6.4300173820972165e-06, + 6.257184445771317e-06 + ] + }, + "time_remote_slicing.RemfileWithCacheContinuousSliceBenchmark.time_slice": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 0.7116888999007642, + 0.7746200999245048, + 0.7001597001217306 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/38c/c24/38cc240b-77c5-418a-9040-a7f582ff6541'\", \"'TwoPhotonSeries'\", '(slice(0, 3, None), slice(0, 796, None), slice(0, 512, None))')": [ + 0.6674359999597073, + 0.5512343000154942, + 0.5494779001455754 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/c98/3a4/c983a4e1-097a-402c-bda8-e6a41cb7e24a'\", \"'data_00002_AD0'\", '(slice(0, 30000, None),)')": [ + 6.591881237390126e-06, + 6.737569993630903e-06, + 6.343617024732397e-06 + ] + }, + "time_remote_slicing.Ros3ContinuousSliceBenchmark.time_slice": { + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/fec/8a6/fec8a690-2ece-4437-8877-8a002ff8bd8a'\", \"'ElectricalSeriesAp'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 0.0033102999441325665, + 0.0034116001334041357, + 0.0033524997998028994 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/38c/c24/38cc240b-77c5-418a-9040-a7f582ff6541'\", \"'TwoPhotonSeries'\", '(slice(0, 3, None), slice(0, 796, None), slice(0, 512, None))')": [ + 0.0008107998874038458, + 0.0007931999862194061, + 0.0007380000315606594 + ], + "(\"'https://dandiarchive.s3.amazonaws.com/blobs/c98/3a4/c983a4e1-097a-402c-bda8-e6a41cb7e24a'\", \"'data_00002_AD0'\", '(slice(0, 30000, None),)')": [ + 6.302597341961204e-06, + 5.955957081368722e-06, + 6.150705781925674e-06 + ] + }, + "time_remote_slicing.ZarrContinuousSliceBenchmark.time_slice": { + "(\"'s3://aind-open-data/ecephys_625749_2022-08-03_15-15-06_nwb_2023-05-16_16-34-55/ecephys_625749_2022-08-03_15-15-06_nwb/ecephys_625749_2022-08-03_15-15-06_experiment1_recording1.nwb.zarr/'\", \"'ElectricalSeriesProbe A-LFP'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 1.1419850999955088, + 1.1669653998687863, + 1.228188700042665 + ] + }, + "time_remote_slicing.ZarrForceNoConsolidatedContinuousSliceBenchmark.time_slice": { + "(\"'s3://aind-open-data/ecephys_625749_2022-08-03_15-15-06_nwb_2023-05-16_16-34-55/ecephys_625749_2022-08-03_15-15-06_nwb/ecephys_625749_2022-08-03_15-15-06_experiment1_recording1.nwb.zarr/'\", \"'ElectricalSeriesProbe A-LFP'\", '(slice(0, 30000, None), slice(0, 384, None))')": [ + 1.0642591000068933, + 1.097299600020051, + 1.493450199952349 + ] + } + } +} From 4d4c1db5ccb4f515dbbc0b2636ae1ec23775c1d6 Mon Sep 17 00:00:00 2001 From: rly Date: Sun, 19 May 2024 22:31:38 -0700 Subject: [PATCH 19/20] Add dataset generation script --- .../scripts/generate_lindi_from_remote.ipynb | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 src/nwb_benchmarks/scripts/generate_lindi_from_remote.ipynb diff --git a/src/nwb_benchmarks/scripts/generate_lindi_from_remote.ipynb b/src/nwb_benchmarks/scripts/generate_lindi_from_remote.ipynb new file mode 100644 index 0000000..d76133f --- /dev/null +++ b/src/nwb_benchmarks/scripts/generate_lindi_from_remote.ipynb @@ -0,0 +1,184 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "abc49392-0615-46f4-9ae6-0f2808c16a09", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import lindi\n", + "from pathlib import Path\n", + "\n", + "max_chunks_to_cache = int(1e9)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "527e3697-9dc9-4ee7-8e62-3397ca754914", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Writing chunk info for acquisition/data_00002_AD0/data: 100%|█████████| 1502/1502 [00:02<00:00, 639.30it/s]\n" + ] + } + ], + "source": [ + "# ICEPHYS\n", + "# DANDI:000717\n", + "# path and URL copied from asset page:\n", + "# https://api.dandiarchive.org/api/dandisets/000717/versions/draft/assets/471ef39b-806c-4946-80b5-125b55839854/\n", + "orig_path = Path(\"sub-1214579789_ses-1214621812_icephys/sub-1214579789_ses-1214621812_icephys.nwb\")\n", + "orig_path.parent.mkdir(parents=True, exist_ok=True) \n", + "lindi_path = orig_path.with_suffix(\".lindi.json\")\n", + "h5_url = \"https://api.dandiarchive.org/api/assets/471ef39b-806c-4946-80b5-125b55839854/download/\"\n", + "\n", + "# Create the h5py-like client\n", + "zarr_store_opts = lindi.LindiH5ZarrStoreOpts(num_dataset_chunks_threshold=max_chunks_to_cache)\n", + "client = lindi.LindiH5pyFile.from_hdf5_file(h5_url, zarr_store_opts=zarr_store_opts)\n", + "\n", + "# Generate a reference file system and write to JSON file\n", + "client.write_lindi_file(str(lindi_path))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "faa14c01-3940-4057-87e0-74b97fd0427f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Writing chunk info for acquisition/ElectricalSeriesAp/data: 100%|█████| 1319/1319 [00:03<00:00, 399.32it/s]\n" + ] + } + ], + "source": [ + "# ECEPHYS\n", + "# DANDI:000717\n", + "# path and URL copied from asset page:\n", + "# https://api.dandiarchive.org/api/dandisets/000717/versions/draft/assets/3d12a902-139a-4c1a-8fd0-0a7faf2fb223/\n", + "orig_path = Path(\"sub-IBL-ecephys/sub-IBL-ecephys_ses-3e7ae7c0_desc-18000000-frames-13653-by-384-chunking.nwb\")\n", + "orig_path.parent.mkdir(parents=True, exist_ok=True) \n", + "lindi_path = orig_path.with_suffix(\".lindi.json\")\n", + "h5_url = \"https://api.dandiarchive.org/api/assets/3d12a902-139a-4c1a-8fd0-0a7faf2fb223/download/\"\n", + "\n", + "# Create the h5py-like client\n", + "zarr_store_opts = lindi.LindiH5ZarrStoreOpts(num_dataset_chunks_threshold=max_chunks_to_cache)\n", + "client = lindi.LindiH5pyFile.from_hdf5_file(h5_url, zarr_store_opts=zarr_store_opts)\n", + "\n", + "# Generate a reference file system and write to JSON file\n", + "client.write_lindi_file(str(lindi_path))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff1dd6d4-7001-41e0-bc58-337851f57b57", + "metadata": {}, + "outputs": [], + "source": [ + "# OPHYS (remote)\n", + "# DANDI:000717\n", + "# path and URL copied from asset page:\n", + "# https://api.dandiarchive.org/api/dandisets/000717/versions/draft/assets/a6951f6e-b67e-4df3-a14f-07b7854b821c/\n", + "# this takes a LONG TIME - over an hour\n", + "# it is faster to download the file (5 min) and run it locally below (1 min)\n", + "orig_path = Path(\"sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.nwb\")\n", + "orig_path.parent.mkdir(parents=True, exist_ok=True) \n", + "lindi_path = orig_path.with_suffix(\".lindi.json\")\n", + "h5_url = \"https://api.dandiarchive.org/api/assets/a6951f6e-b67e-4df3-a14f-07b7854b821c/download/\"\n", + "\n", + "# Create the h5py-like client\n", + "zarr_store_opts = lindi.LindiH5ZarrStoreOpts(num_dataset_chunks_threshold=max_chunks_to_cache)\n", + "client = lindi.LindiH5pyFile.from_hdf5_file(h5_url, zarr_store_opts=zarr_store_opts)\n", + "\n", + "# Generate a reference file system and write to JSON file\n", + "client.write_lindi_file(str(lindi_path))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "da3c2d01-4824-4742-90b3-7be00b2410f7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Writing chunk info for acquisition/TwoPhotonSeries/data: 100%|█| 1333568/1333568 [00:08<00:00, 163375.64it/\n" + ] + } + ], + "source": [ + "# OPHYS (local)\n", + "# DANDI:000717\n", + "# path and URL copied from asset page:\n", + "# https://api.dandiarchive.org/api/dandisets/000717/versions/draft/assets/a6951f6e-b67e-4df3-a14f-07b7854b821c/\n", + "orig_path = Path(\"sub-R6_ses-20200206T210000_behavior+ophys/sub-R6_ses-20200206T210000_behavior+ophys.nwb\")\n", + "orig_path.parent.mkdir(parents=True, exist_ok=True) \n", + "lindi_path = orig_path.with_suffix(\".lindi.json\")\n", + "h5_url = \"https://api.dandiarchive.org/api/assets/a6951f6e-b67e-4df3-a14f-07b7854b821c/download/\"\n", + "\n", + "# Create the h5py-like client\n", + "zarr_store_opts = lindi.LindiH5ZarrStoreOpts(num_dataset_chunks_threshold=max_chunks_to_cache)\n", + "\n", + "# Use local refs\n", + "url_or_path = \"/Users/rly/Downloads/sub-R6_ses-20200206T210000_behavior+ophys.nwb\"\n", + "url = h5_url\n", + "local_cache = None\n", + "mode = \"r\"\n", + "\n", + "zarr_store = lindi.LindiH5ZarrStore.from_file(url_or_path, local_cache=local_cache, opts=zarr_store_opts, url=url)\n", + "client = lindi.LindiH5pyFile.from_zarr_store(\n", + " zarr_store=zarr_store,\n", + " mode=mode,\n", + " local_cache=local_cache\n", + ")\n", + "\n", + "# Generate a reference file system and write to JSON file\n", + "client.write_lindi_file(str(lindi_path))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ed6ac45-f30b-4417-be97-385a255476f7", + "metadata": {}, + "outputs": [], + "source": [ + "# upload to dandi staging on command line\n", + "# DANDI_API_KEY=xx DANDI_DEVEL=1 dandi upload --dandi-instance=https://api-staging.dandiarchive.org/api --allow-any-path" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 4d25721637e982a08bb7700f54f92378d7423abb Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Mon, 20 May 2024 09:06:53 -0700 Subject: [PATCH 20/20] Update environments/nwb_benchmarks.yaml Co-authored-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com> --- environments/nwb_benchmarks.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environments/nwb_benchmarks.yaml b/environments/nwb_benchmarks.yaml index f2caf37..f1c3a41 100644 --- a/environments/nwb_benchmarks.yaml +++ b/environments/nwb_benchmarks.yaml @@ -15,7 +15,7 @@ dependencies: - aiohttp - remfile - pyshark - - lindi>=0.3.5 + - lindi>=0.3.6 - pynwb @ git+https://github.com/NeurodataWithoutBorders/pynwb.git@expose_aws_region # required until region fix is released - hdmf @ git+https://github.com/hdmf-dev/hdmf.git@expose_aws_region # required until region fix is released - hdmf-zarr