From d6f8cb421b7df3b111d2d633cc518be60122ac3d Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 13:12:07 -0800 Subject: [PATCH 01/58] Add `partition_file_submit_async` --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 10 +++++++++- lib/aryn-sdk/aryn_sdk/partition/partition.py | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index 2c2da48db..aecc3cc18 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -1,4 +1,11 @@ -from .partition import partition_file, tables_to_pandas, table_elem_to_dataframe, convert_image_element, PartitionError +from .partition import ( + partition_file, + partition_file_submit_async, + tables_to_pandas, + table_elem_to_dataframe, + convert_image_element, + PartitionError, +) from .art import draw_with_boxes __all__ = [ @@ -8,4 +15,5 @@ "draw_with_boxes", "convert_image_element", "PartitionError", + "partition_file_submit_async", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 619c9ee1d..11d481fcf 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -174,7 +174,7 @@ def partition_file( http_header = {"Authorization": "Bearer {}".format(aryn_config.api_key())} resp = requests.post(docparse_url, files=files, headers=http_header, stream=stream, verify=ssl_verify) - if resp.status_code != 200: + if resp.status_code not in (200, 202): raise requests.exceptions.HTTPError( f"Error: status_code: {resp.status_code}, reason: {resp.text}", response=resp ) @@ -263,6 +263,15 @@ def _json_options( return json.dumps(options) +def partition_file_submit_async(**kwargs): + async_url = kwargs.get("docparse_url", ARYN_DOCPARSE_URL) + if "/v1/async/submit" not in async_url: + async_url = async_url.replace("/v1/", "/v1/async/submit/") + kwargs["docparse_url"] = async_url + # raise Exception(kwargs["docparse_url"]) + return partition_file(**kwargs) + + # Heavily adapted from lib/sycamore/data/table.py::Table.to_csv() def table_elem_to_dataframe(elem: dict) -> Optional[pd.DataFrame]: """ From 2216c012e679713dd96b73261a5eea762aa5ee1e Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 13:26:49 -0800 Subject: [PATCH 02/58] Add `partition_file_result_async` --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 2 ++ lib/aryn-sdk/aryn_sdk/partition/partition.py | 29 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index aecc3cc18..90321b49a 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -1,6 +1,7 @@ from .partition import ( partition_file, partition_file_submit_async, + partition_file_result_async, tables_to_pandas, table_elem_to_dataframe, convert_image_element, @@ -16,4 +17,5 @@ "convert_image_element", "PartitionError", "partition_file_submit_async", + "partition_file_result_async" ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 11d481fcf..7782e4d97 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -272,6 +272,35 @@ def partition_file_submit_async(**kwargs): return partition_file(**kwargs) +def partition_file_result_async( + job_id: str, + aryn_async_url: str = f"{ARYN_DOCPARSE_URL.split('/v1/',1)[0]}/v1/async/result", + aryn_api_key: Optional[str] = None, + aryn_config: Optional[ArynConfig] = None, + ssl_verify: bool = True, +): + if aryn_api_key is not None: + if aryn_config is not None: + _logger.warning("Both aryn_api_key and aryn_config were provided. Using aryn_api_key") + aryn_config = ArynConfig(aryn_api_key=aryn_api_key) + if aryn_config is None: + aryn_config = ArynConfig() + + # Workaround for vcr. See https://github.com/aryn-ai/sycamore/issues/958 + stream = True + if "vcr" in sys.modules: + ul3 = sys.modules.get("urllib3") + if ul3: + # Look for tell-tale patched method... + mod = ul3.connectionpool.is_connection_dropped.__module__ + if "mock" in mod: + stream = False + + specific_job_url = f"{aryn_async_url}/{job_id}" + http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} + return requests.get(specific_job_url, headers=http_header, stream=stream, verify=ssl_verify) + + # Heavily adapted from lib/sycamore/data/table.py::Table.to_csv() def table_elem_to_dataframe(elem: dict) -> Optional[pd.DataFrame]: """ From eb327a8e085f98caa0f79a53d84ccdd81f79792c Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 13:28:27 -0800 Subject: [PATCH 03/58] Fix linting --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index 90321b49a..2cd860562 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -17,5 +17,5 @@ "convert_image_element", "PartitionError", "partition_file_submit_async", - "partition_file_result_async" + "partition_file_result_async", ] From fec3c5141e9771c1d6d3a1b253ff1f63c12384f7 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 13:47:58 -0800 Subject: [PATCH 04/58] Add docstring, return type for `partition_file_submit_async` --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 23 +++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 7782e4d97..87b7e68c4 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -263,7 +263,28 @@ def _json_options( return json.dumps(options) -def partition_file_submit_async(**kwargs): +def partition_file_submit_async(**kwargs) -> dict: + """ + Submits a file to be partitioned asynchronously. Takes same arguments as partition_file. + + Returns: A dictionary containing "job_id" which can be used with the `partition_file_result_async` function to get the results. + + Example: + .. code-block:: python + + from aryn_sdk.partition import partition_file_submit_async + + with open("my-favorite-pdf.pdf", "rb") as f: + job = partition_file_submit_async( + f, + ary_api_key="MY-ARYN-API-KEY", + use_ocr=True, + extract_table_structure=True, + ) + job_id = job["job_id"] + """ + + async_url = kwargs.get("docparse_url", ARYN_DOCPARSE_URL) if "/v1/async/submit" not in async_url: async_url = async_url.replace("/v1/", "/v1/async/submit/") From dc8059f38f2ee7e9fc2ee54b6f789c6cb9af19af Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 14:08:24 -0800 Subject: [PATCH 05/58] Fix linting --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 87b7e68c4..e7e0324e2 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -267,7 +267,9 @@ def partition_file_submit_async(**kwargs) -> dict: """ Submits a file to be partitioned asynchronously. Takes same arguments as partition_file. - Returns: A dictionary containing "job_id" which can be used with the `partition_file_result_async` function to get the results. + Returns: + A dictionary containing "job_id" which can be used with the `partition_file_result_async` + function to get the results. Example: .. code-block:: python @@ -284,7 +286,6 @@ def partition_file_submit_async(**kwargs) -> dict: job_id = job["job_id"] """ - async_url = kwargs.get("docparse_url", ARYN_DOCPARSE_URL) if "/v1/async/submit" not in async_url: async_url = async_url.replace("/v1/", "/v1/async/submit/") From 735c828e75efb3db5a5770ebe0c97de0e28091c8 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 14:22:51 -0800 Subject: [PATCH 06/58] Make `partition_file_result_async` easier to use --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 2 ++ lib/aryn-sdk/aryn_sdk/partition/partition.py | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index 2cd860562..3b6ecd06d 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -6,6 +6,7 @@ table_elem_to_dataframe, convert_image_element, PartitionError, + NoSuchAsyncPartitionerJob, ) from .art import draw_with_boxes @@ -18,4 +19,5 @@ "PartitionError", "partition_file_submit_async", "partition_file_result_async", + "NoSuchAsyncPartitionerJob", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index e7e0324e2..4160ef7a0 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -26,6 +26,9 @@ def __init__(self, message: str, status_code: int) -> None: super().__init__(message) self.status_code = status_code +class NoSuchAsyncPartitionerJob(Exception): + pass + def partition_file( file: Union[BinaryIO, str, PathLike], @@ -300,7 +303,7 @@ def partition_file_result_async( aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, ssl_verify: bool = True, -): +) -> Optional[dict]: if aryn_api_key is not None: if aryn_config is not None: _logger.warning("Both aryn_api_key and aryn_config were provided. Using aryn_api_key") @@ -320,7 +323,14 @@ def partition_file_result_async( specific_job_url = f"{aryn_async_url}/{job_id}" http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} - return requests.get(specific_job_url, headers=http_header, stream=stream, verify=ssl_verify) + response = requests.get(specific_job_url, headers=http_header, stream=stream, verify=ssl_verify) + + if response.status_code == 200: + return response.json() + elif response.status_code == 202: + return None + elif response.status_code == 404: + raise NoSuchAsyncPartitionerJob() # Heavily adapted from lib/sycamore/data/table.py::Table.to_csv() From f2ebd148a6c70bc81688adbd52f7bacba1ba7ea7 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 14:23:22 -0800 Subject: [PATCH 07/58] Add `partition_file_result_async` docstring --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 4160ef7a0..075a88fd8 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -304,6 +304,21 @@ def partition_file_result_async( aryn_config: Optional[ArynConfig] = None, ssl_verify: bool = True, ) -> Optional[dict]: + """ + Get the results of an asynchronous partitioning job by job_id. Meant to be used with `partition_file_submit_async`. + + Returns: + If the specified job is done and the call is successful, then this function returns the same output as a call + to `partition_file`. That would be a dictionary containing "status", "elements", and possibly "error". However, + if the `output_format` option of the original request was "markdown" then it returns a dictionary of "status", + "markdown", and possibly "error". + + Returns None if the job is still in progress. + + Raises a NoSuchAsyncPartitionerJob exception if the job_id is not found. + + If this job is still in progress, the response will be a 202 status code with a "status" field of "processing". + """ if aryn_api_key is not None: if aryn_config is not None: _logger.warning("Both aryn_api_key and aryn_config were provided. Using aryn_api_key") From cc0ce7c1c009d7dac8fd163a3c4ee8af7f716baf Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 14:51:34 -0800 Subject: [PATCH 08/58] Fix linting --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 075a88fd8..f9084a3a4 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -26,6 +26,7 @@ def __init__(self, message: str, status_code: int) -> None: super().__init__(message) self.status_code = status_code + class NoSuchAsyncPartitionerJob(Exception): pass @@ -339,7 +340,7 @@ def partition_file_result_async( specific_job_url = f"{aryn_async_url}/{job_id}" http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} response = requests.get(specific_job_url, headers=http_header, stream=stream, verify=ssl_verify) - + if response.status_code == 200: return response.json() elif response.status_code == 202: From c80bbdd7dfa76e8c307bafebf53fd668b7847ddc Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 16 Jan 2025 15:13:05 -0800 Subject: [PATCH 09/58] Add tests --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 26 +++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 0671b7433..e78241b03 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -1,9 +1,15 @@ from aryn_sdk.partition.partition import convert_image_element, tables_to_pandas import pytest import json +import time from pathlib import Path -from aryn_sdk.partition import partition_file +from aryn_sdk.partition import ( + partition_file, + partition_file_submit_async, + partition_file_result_async, + NoSuchAsyncPartitionerJob, +) from requests.exceptions import HTTPError RESOURCE_DIR = Path(__file__).parent / "resources" @@ -140,6 +146,9 @@ def test_data_to_pandas(): assert df.columns.to_list() == ["(Millions)", "2018", "2017", "2016"] assert df["2018"][13] == "134" +def test_invalid_job_id(): + with pytest.raises(NoSuchAsyncPartitionerJob): + partition_file_result_async("INVALID_JOB_ID") def test_convert_img(): with open(RESOURCE_DIR / "image" / "partitioning_output.json", "r") as f: @@ -155,3 +164,18 @@ def test_convert_img(): with open(RESOURCE_DIR / "image" / "pngb64str.txt", "r") as f: real_str = f.read().strip() assert png_str == real_str + +def test_partition_file_async(): + with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: + job_id = partition_file_submit_async(f)["job_id"] + + start = time.time() + actual_result = None + while not actual_result and time.time() - start < 60 * 5: + actual_result = partition_file_result_async(job_id) + time.sleep(5) + + with open(RESOURCE_DIR / "json" / "3m_output.json", "rb") as f: + expected_result = json.load(f) + + assert expected_result["elements"] == actual_result["elements"] From 85678fbb13c05f747ae50934bd9c2723535ba86b Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 15:24:24 -0800 Subject: [PATCH 10/58] Add general error when unexpected http code encountered --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 2 ++ lib/aryn-sdk/aryn_sdk/partition/partition.py | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index 3b6ecd06d..fd1053709 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -7,6 +7,7 @@ convert_image_element, PartitionError, NoSuchAsyncPartitionerJob, + AsyncPartitionerError, ) from .art import draw_with_boxes @@ -20,4 +21,5 @@ "partition_file_submit_async", "partition_file_result_async", "NoSuchAsyncPartitionerJob", + "AsyncPartitionerError", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index f9084a3a4..c7cf3a9e2 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -27,6 +27,12 @@ def __init__(self, message: str, status_code: int) -> None: self.status_code = status_code +class AsyncPartitionerError(Exception): + def __init__(self, message: str, status_code: int) -> None: + super().__init__(message) + self.status_code = status_code + + class NoSuchAsyncPartitionerJob(Exception): pass @@ -347,6 +353,8 @@ def partition_file_result_async( return None elif response.status_code == 404: raise NoSuchAsyncPartitionerJob() + else: + raise AsyncPartitionerError(f"Failed to get results of async partition job {job_id}", response.status_code) # Heavily adapted from lib/sycamore/data/table.py::Table.to_csv() From a220befd87896f4edf4c7f665c93deaf3b8e4bee Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 15:25:14 -0800 Subject: [PATCH 11/58] Fix linting --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index e78241b03..f422027f3 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -146,10 +146,12 @@ def test_data_to_pandas(): assert df.columns.to_list() == ["(Millions)", "2018", "2017", "2016"] assert df["2018"][13] == "134" + def test_invalid_job_id(): with pytest.raises(NoSuchAsyncPartitionerJob): partition_file_result_async("INVALID_JOB_ID") + def test_convert_img(): with open(RESOURCE_DIR / "image" / "partitioning_output.json", "r") as f: data = json.load(f) @@ -165,6 +167,7 @@ def test_convert_img(): real_str = f.read().strip() assert png_str == real_str + def test_partition_file_async(): with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: job_id = partition_file_submit_async(f)["job_id"] From 784122e181a3bcfb3d7bd54c50a120d0c460bdc6 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 15:53:34 -0800 Subject: [PATCH 12/58] Rename `NoSuchAsyncPartitionerJob` to `NoSuchAsyncPartitionerJobError` --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 4 ++-- lib/aryn-sdk/aryn_sdk/partition/partition.py | 6 +++--- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index fd1053709..23c6aed23 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -6,7 +6,7 @@ table_elem_to_dataframe, convert_image_element, PartitionError, - NoSuchAsyncPartitionerJob, + NoSuchAsyncPartitionerJobError, AsyncPartitionerError, ) from .art import draw_with_boxes @@ -20,6 +20,6 @@ "PartitionError", "partition_file_submit_async", "partition_file_result_async", - "NoSuchAsyncPartitionerJob", + "NoSuchAsyncPartitionerJobError", "AsyncPartitionerError", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index c7cf3a9e2..8a14af173 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -33,7 +33,7 @@ def __init__(self, message: str, status_code: int) -> None: self.status_code = status_code -class NoSuchAsyncPartitionerJob(Exception): +class NoSuchAsyncPartitionerJobError(Exception): pass @@ -322,7 +322,7 @@ def partition_file_result_async( Returns None if the job is still in progress. - Raises a NoSuchAsyncPartitionerJob exception if the job_id is not found. + Raises a NoSuchAsyncPartitionerJobError if the job_id is not found. If this job is still in progress, the response will be a 202 status code with a "status" field of "processing". """ @@ -352,7 +352,7 @@ def partition_file_result_async( elif response.status_code == 202: return None elif response.status_code == 404: - raise NoSuchAsyncPartitionerJob() + raise NoSuchAsyncPartitionerJobError() else: raise AsyncPartitionerError(f"Failed to get results of async partition job {job_id}", response.status_code) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index f422027f3..d2a97b277 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -8,7 +8,7 @@ partition_file, partition_file_submit_async, partition_file_result_async, - NoSuchAsyncPartitionerJob, + NoSuchAsyncPartitionerJobError, ) from requests.exceptions import HTTPError @@ -148,7 +148,7 @@ def test_data_to_pandas(): def test_invalid_job_id(): - with pytest.raises(NoSuchAsyncPartitionerJob): + with pytest.raises(NoSuchAsyncPartitionerJobError): partition_file_result_async("INVALID_JOB_ID") From e08bd74dfec246df315aac8d8f921599a0fc02fd Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 15:57:00 -0800 Subject: [PATCH 13/58] Fix `test_partition` with current exception (PartitionError not ValueError) --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index d2a97b277..263260153 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -9,6 +9,7 @@ partition_file_submit_async, partition_file_result_async, NoSuchAsyncPartitionerJobError, + PartitionError, ) from requests.exceptions import HTTPError @@ -77,7 +78,7 @@ def test_partition(pdf, kwargs, response, mocker): with open(pdf, "rb") as f: if kwargs.get("selected_pages") == [0]: - with pytest.raises(ValueError) as einfo: + with pytest.raises(PartitionError) as einfo: new_response = partition_file(f, **kwargs) assert "Invalid page number (0)" in str(einfo.value) else: From 6c4b9dd1577047ed89c10276e38c8989115bd202 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 16:08:04 -0800 Subject: [PATCH 14/58] Fix expected type of Exception in `test_partition_it_zero_page` --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 263260153..d8d57d234 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -122,7 +122,7 @@ def test_partition_it(pdf, kwargs, response): def test_partition_it_zero_page(): - with pytest.raises(ValueError) as einfo: + with pytest.raises(PartitionError) as einfo: with open(RESOURCE_DIR / "pdfs" / "SPsort.pdf", "rb") as f: partition_file(f, selected_pages=[0]) From 3d73b6016c26cf18b6f4591f89e0ef812b190535 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 16:09:15 -0800 Subject: [PATCH 15/58] Update reference json for `test_partition_it` integ test --- .../test/resources/json/3m_output.json | 65 +- .../resources/json/3m_output_ocr_table.json | 1366 +++++++++-------- .../json/SPsort_output_images_page1.json | 103 +- 3 files changed, 827 insertions(+), 707 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/resources/json/3m_output.json b/lib/aryn-sdk/aryn_sdk/test/resources/json/3m_output.json index 8d98f2116..b8e18af6f 100644 --- a/lib/aryn-sdk/aryn_sdk/test/resources/json/3m_output.json +++ b/lib/aryn-sdk/aryn_sdk/test/resources/json/3m_output.json @@ -4,39 +4,40 @@ "Until you get a line that matches ' ]\n', you can convert the partial", "output to a json document by appending '\"\"]}' to the partial output.", "", - "T+ 0.00: Server version 0.2024.06.28", - "T+ 0.00: Received request with aryn_call_id=c23b169c-62ed-452e-bd16-3f7483de2305", + "T+ 0.00: Server version aryn-partitioner-0.20250113.175427 Model version 1.4", + "T+ 0.00: Received request with aryn_call_id=72cb99f9-c127-4a83-88da-a0546cc1bd77", "T+ 0.00: Waiting for scheduling", "T+ 0.00: Preprocessing document", - "T+ 0.01: Done preprocessing document", - "T+ 0.93: completed page 1", + "T+ 0.00: Done preprocessing document", + "T+ 0.53: Completed work on page 1", "" ], + "status_code": 200, "elements": [ { "type": "Page-header", "bbox": [ - 0.09254883710075827, - 0.02588048761541193, - 0.18516457950367646, - 0.036462620821866125 + 0.09259089750402114, + 0.026172181909734554, + 0.18483936982996324, + 0.03624992023814808 ], "properties": { - "score": 0.7105238437652588, + "score": 0.7373364567756653, "page_number": 1 }, "text_representation": "Table of Contents \n" }, { - "type": "Section-header", + "type": "Caption", "bbox": [ - 0.0923248291015625, - 0.0672761327570135, - 0.3043683220358456, - 0.09994891079989347 + 0.09244359633501838, + 0.06721047834916548, + 0.30449961942784926, + 0.10004626187411221 ], "properties": { - "score": 0.4793054163455963, + "score": 0.3883528411388397, "page_number": 1 }, "text_representation": "3M Company and Subsidiaries\nConsolidated Statement of Cash Flow s\nYears ended December 31\n" @@ -44,31 +45,31 @@ { "type": "table", "bbox": [ - 0.0904532668169807, - 0.11156481656161221, - 0.8908106186810661, - 0.6249001242897727 + 0.0905675910500919, + 0.11067503495649858, + 0.8910016946231618, + 0.6249686501242898 ], "properties": { - "score": 0.9139547944068909, + "score": 0.9064249992370605, "title": null, "columns": null, "rows": null, "page_number": 1 }, - "table": null, - "_override_text": "(Millions)\nCash Flows from Operating Activities\nNet income including noncontrolling interest\nAdjustments to reconcile net income including noncontrolling interest to net cash\n 2018\n 2017\n 2016\n $\n 5,363 $\n 4,869 $\n 5,058 \n provided by operating activities\nDepreciation and amortization\nCompany pension and postretirement contributions\nCompany pension and postretirement expense\nStock-based compensation expense\nGain on sale of businesses\nDeferred income taxes\nChanges in assets and liabilities\n Accounts receivable\nInventories\nAccounts payable\nAccrued income taxes (current and long-term)\n Other — net\n Net cash provided by (used in) operating activities\n Cash Flows from Investing Activities\nPurchases of property, plant and equipment (PP&E)\nProceeds from sale of PP&E and other assets\nAcquisitions, net of cash acquired\nPurchases of marketable securities and investments\nProceeds from maturities and sale of marketable securities and investments\nProceeds from sale of businesses, net of cash sold\n Other — net\nNet cash provided by (used in) investing activities\n Cash Flows from Financing Activities\nChange in short-term debt — net\nRepayment of debt (maturities greater than 90 days)\nProceeds from debt (maturities greater than 90 days)\nPurchases of treasury stock\nProceeds from issuance of treasury stock pursuant to stock option and benefit plans\nDividends paid to shareholders\nOther — net\nNet cash provided by (used in) financing activities\n Effect of exchange rate changes on cash and cash equivalents\n Net increase (decrease) in cash and cash equivalents\nCash and cash equivalents at beginning of year\nCash and cash equivalents at end of period\n 1,488 \n(370) \n410 \n302 \n(545) \n(57) \n (305) \n(509) \n408 \n134 \n120 \n6,439 \n (1,577) \n262 \n13 \n(1,828) \n2,497 \n 846 \n 9 \n222 \n (284) \n(1,034) \n2,251 \n(4,870) \n485 \n(3,193) \n(56) \n(6,701) \n (160) \n 1,544 \n(967) \n334 \n324 \n(586) \n107 \n (245) \n(387) \n24 \n967 \n256 \n6,240 \n (1,373) \n49 \n(2,023) \n(2,152) \n1,354 \n 1,065 \n(6) \n(3,086) \n 578 \n(962) \n1,987 \n(2,068) \n734 \n(2,803) \n(121) \n(2,655) \n 156 \n (200) \n3,053 \n2,853 $\n 655 \n2,398 \n3,053 $\n $\n 1,474 \n(383) \n250 \n298 \n(111) \n 7 \n (313) \n57 \n148 \n101 \n76 \n6,662 \n (1,420) \n58 \n(16) \n(1,410) \n1,247 \n 142 \n(4) \n(1,403) \n (797) \n(992) \n2,832 \n(3,753) \n804 \n(2,678) \n(42) \n(4,626) \n (33) \n 600 \n1,798 \n2,398 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n" + "text_representation": "(Millions)\nCash Flows from Operating Activities\nNet income including noncontrolling interest\nAdjustments to reconcile net income including noncontrolling interest to net cash\n 2018\n 2017\n 2016\n $\n 5,363 $\n 4,869 $\n 5,058 \n provided by operating activities\nDepreciation and amortization\nCompany pension and postretirement contributions\nCompany pension and postretirement expense\nStock-based compensation expense\nGain on sale of businesses\nDeferred income taxes\nChanges in assets and liabilities\n Accounts receivable\nInventories\nAccounts payable\nAccrued income taxes (current and long-term)\n Other \u2014 net\n Net cash provided by (used in) operating activities\n Cash Flows from Investing Activities\nPurchases of property, plant and equipment (PP&E)\nProceeds from sale of PP&E and other assets\nAcquisitions, net of cash acquired\nPurchases of marketable securities and investments\nProceeds from maturities and sale of marketable securities and investments\nProceeds from sale of businesses, net of cash sold\n Other \u2014 net\nNet cash provided by (used in) investing activities\n Cash Flows from Financing Activities\nChange in short-term debt \u2014 net\nRepayment of debt (maturities greater than 90 days)\nProceeds from debt (maturities greater than 90 days)\nPurchases of treasury stock\nProceeds from issuance of treasury stock pursuant to stock option and benefit plans\nDividends paid to shareholders\nOther \u2014 net\nNet cash provided by (used in) financing activities\n Effect of exchange rate changes on cash and cash equivalents\n Net increase (decrease) in cash and cash equivalents\nCash and cash equivalents at beginning of year\nCash and cash equivalents at end of period\n 1,488 \n(370) \n410 \n302 \n(545) \n(57) \n (305) \n(509) \n408 \n134 \n120 \n6,439 \n (1,577) \n262 \n13 \n(1,828) \n2,497 \n 846 \n 9 \n222 \n (284) \n(1,034) \n2,251 \n(4,870) \n485 \n(3,193) \n(56) \n(6,701) \n (160) \n 1,544 \n(967) \n334 \n324 \n(586) \n107 \n (245) \n(387) \n24 \n967 \n256 \n6,240 \n (1,373) \n49 \n(2,023) \n(2,152) \n1,354 \n 1,065 \n(6) \n(3,086) \n 578 \n(962) \n1,987 \n(2,068) \n734 \n(2,803) \n(121) \n(2,655) \n 156 \n (200) \n3,053 \n2,853 $\n 655 \n2,398 \n3,053 $\n $\n 1,474 \n(383) \n250 \n298 \n(111) \n 7 \n (313) \n57 \n148 \n101 \n76 \n6,662 \n (1,420) \n58 \n(16) \n(1,410) \n1,247 \n 142 \n(4) \n(1,403) \n (797) \n(992) \n2,832 \n(3,753) \n804 \n(2,678) \n(42) \n(4,626) \n (33) \n 600 \n1,798 \n2,398 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n", + "table": null }, { "type": "Text", "bbox": [ - 0.09334101957433363, - 0.636026777787642, - 0.6066466567095589, - 0.6459264026988636 + 0.09298765294692096, + 0.6364184015447443, + 0.6064737477022059, + 0.6465563409978693 ], "properties": { - "score": 0.8346976041793823, + "score": 0.4158885180950165, "page_number": 1 }, "text_representation": "The accompanying Notes to Consolidated Financial Statements are an integral part of this statement.\n" @@ -76,13 +77,13 @@ { "type": "Page-footer", "bbox": [ - 0.47960643095128674, - 0.6814282781427556, - 0.4929185216567096, - 0.6909636896306818 + 0.47945628446691174, + 0.6812337979403409, + 0.49324290556066175, + 0.6917808393998579 ], "properties": { - "score": 0.8874315023422241, + "score": 0.908870279788971, "page_number": 1 }, "text_representation": "60\n" diff --git a/lib/aryn-sdk/aryn_sdk/test/resources/json/3m_output_ocr_table.json b/lib/aryn-sdk/aryn_sdk/test/resources/json/3m_output_ocr_table.json index 5aa5ef2d0..97d36a454 100644 --- a/lib/aryn-sdk/aryn_sdk/test/resources/json/3m_output_ocr_table.json +++ b/lib/aryn-sdk/aryn_sdk/test/resources/json/3m_output_ocr_table.json @@ -4,58 +4,60 @@ "Until you get a line that matches ' ]\n', you can convert the partial", "output to a json document by appending '\"\"]}' to the partial output.", "", - "T+ 0.00: Server version 0.2024.06.28", - "T+ 0.00: Received request with aryn_call_id=ae2c4bc0-57c9-4fb9-9210-55a4e43f73f0", + "T+ 0.00: Server version aryn-partitioner-0.20250113.175427 Model version 1.4", + "T+ 0.00: Received request with aryn_call_id=de1de753-1907-4404-a019-b6f8311ff1e6", "T+ 0.00: Waiting for scheduling", "T+ 0.00: Preprocessing document", - "T+ 0.01: Done preprocessing document", - "T+ 2.82: completed page 1", + "T+ 0.00: Done preprocessing document", + "T+ 0.82: Completed work on page 1", "" ], + "status_code": 200, "elements": [ { "type": "Page-header", "bbox": [ - 0.09254883710075827, - 0.02588048761541193, - 0.18516457950367646, - 0.036462620821866125 + 0.09259089750402114, + 0.026172181909734554, + 0.18483936982996324, + 0.03624992023814808 ], "properties": { - "score": 0.7105238437652588, + "score": 0.7373364567756653, "page_number": 1 }, - "text_representation": "" + "text_representation": "Table of Contents" }, { - "type": "Section-header", + "type": "Caption", "bbox": [ - 0.0923248291015625, - 0.0672761327570135, - 0.3043683220358456, - 0.09994891079989347 + 0.09244359633501838, + 0.06721047834916548, + 0.30449961942784926, + 0.10004626187411221 ], "properties": { - "score": 0.4793054163455963, + "score": 0.3883528411388397, "page_number": 1 }, - "text_representation": "3M Company and Subsidiaries\nConsolidated Statement of Cash Flows\nYears ended December 31\n" + "text_representation": "3M Company and Subsidiaries. Consolidated Statement of Cash Flow s Years ended December 31" }, { "type": "table", "bbox": [ - 0.0904532668169807, - 0.11156481656161221, - 0.8908106186810661, - 0.6249001242897727 + 0.0905675910500919, + 0.11067503495649858, + 0.8910016946231618, + 0.6249686501242898 ], "properties": { - "score": 0.9139547944068909, + "score": 0.9064249992370605, "title": null, - "columns": null, - "rows": null, + "columns": 4, + "rows": 39, "page_number": 1 }, + "text_representation": null, "table": { "cells": [ { @@ -68,10 +70,10 @@ ], "is_header": true, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.11292845292524858, - "x2": 0.5186885609346278, - "y2": 0.12201936201615766 + "x1": 0.09115582634420956, + "y1": 0.11203867132013494, + "x2": 0.5158617086971508, + "y2": 0.1234023076837713 }, "properties": {} }, @@ -85,10 +87,10 @@ ], "is_header": true, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.11292845292524858, - "x2": 0.6622179726993337, - "y2": 0.12201936201615766 + "x1": 0.5611558263442096, + "y1": 0.11203867132013494, + "x2": 0.6635087675206801, + "y2": 0.1234023076837713 }, "properties": {} }, @@ -102,10 +104,10 @@ ], "is_header": true, "bbox": { - "x1": 0.713394443287569, - "y1": 0.11292845292524858, - "x2": 0.7751591491699219, - "y2": 0.12201936201615766 + "x1": 0.6746852381089155, + "y1": 0.11203867132013494, + "x2": 0.7758617086971508, + "y2": 0.1234023076837713 }, "properties": {} }, @@ -119,15 +121,15 @@ ], "is_header": true, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.11292845292524858, - "x2": 0.8857473844640396, - "y2": 0.12201936201615766 + "x1": 0.7840970028147978, + "y1": 0.11203867132013494, + "x2": 0.8876264145795036, + "y2": 0.1234023076837713 }, "properties": {} }, { - "content": "Cash Flows Operating Activities from", + "content": "Cash Flows from Operating Activities", "rows": [ 1 ], @@ -139,30 +141,78 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.12201936201615766, - "x2": 0.8857473844640396, - "y2": 0.13611027110706675 + "x1": 0.09115582634420956, + "y1": 0.12294776222922585, + "x2": 0.8876264145795036, + "y2": 0.1343113985928622 }, "properties": {} }, { - "content": "Net income including noncontrolling interest 5,363 4.869 5,058", + "content": "Net income including noncontrolling interest.", + "rows": [ + 2 + ], + "cols": [ + 0 + ], + "is_header": false, + "bbox": { + "x1": 0.09115582634420956, + "y1": 0.13476594404740766, + "x2": 0.5158617086971508, + "y2": 0.14703867132013496 + }, + "properties": {} + }, + { + "content": "$ 5,363", + "rows": [ + 2 + ], + "cols": [ + 1 + ], + "is_header": false, + "bbox": { + "x1": 0.5611558263442096, + "y1": 0.13476594404740766, + "x2": 0.6635087675206801, + "y2": 0.14703867132013496 + }, + "properties": {} + }, + { + "content": "$ 4,869", + "rows": [ + 2 + ], + "cols": [ + 2 + ], + "is_header": false, + "bbox": { + "x1": 0.6746852381089155, + "y1": 0.13476594404740766, + "x2": 0.7758617086971508, + "y2": 0.14703867132013496 + }, + "properties": {} + }, + { + "content": "$ 5,058", "rows": [ 2 ], "cols": [ - 0, - 1, - 2, 3 ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.13338299837979403, - "x2": 0.8857473844640396, - "y2": 0.14701936201615767 + "x1": 0.7840970028147978, + "y1": 0.13476594404740766, + "x2": 0.8876264145795036, + "y2": 0.14703867132013496 }, "properties": {} }, @@ -172,17 +222,65 @@ 3 ], "cols": [ - 0, - 1, - 2, + 0 + ], + "is_header": false, + "bbox": { + "x1": 0.09115582634420956, + "y1": 0.14703867132013496, + "x2": 0.5158617086971508, + "y2": 0.16794776222922586 + }, + "properties": {} + }, + { + "content": "", + "rows": [ 3 ], + "cols": [ + 1 + ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.14429208928888496, - "x2": 0.8857473844640396, - "y2": 0.1697466347434304 + "x1": 0.5611558263442096, + "y1": 0.14703867132013496, + "x2": 0.6635087675206801, + "y2": 0.16794776222922586 + }, + "properties": {} + }, + { + "content": "", + "rows": [ + 3 + ], + "cols": [ + 2 + ], + "is_header": false, + "bbox": { + "x1": 0.6746852381089155, + "y1": 0.14703867132013496, + "x2": 0.7758617086971508, + "y2": 0.16794776222922586 + }, + "properties": {} + }, + { + "content": "", + "rows": [ + 3 + ], + "cols": [ + 3 + ], + "is_header": false, + "bbox": { + "x1": 0.7840970028147978, + "y1": 0.14703867132013496, + "x2": 0.8876264145795036, + "y2": 0.16794776222922586 }, "properties": {} }, @@ -196,10 +294,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.1688375438343395, - "x2": 0.5186885609346278, - "y2": 0.1806557256525213 + "x1": 0.09115582634420956, + "y1": 0.16840230768377132, + "x2": 0.5158617086971508, + "y2": 0.1815841258655895 }, "properties": {} }, @@ -213,10 +311,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.1688375438343395, - "x2": 0.6622179726993337, - "y2": 0.1806557256525213 + "x1": 0.5611558263442096, + "y1": 0.16840230768377132, + "x2": 0.6635087675206801, + "y2": 0.1815841258655895 }, "properties": {} }, @@ -230,10 +328,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.1688375438343395, - "x2": 0.7751591491699219, - "y2": 0.1806557256525213 + "x1": 0.6746852381089155, + "y1": 0.16840230768377132, + "x2": 0.7758617086971508, + "y2": 0.1815841258655895 }, "properties": {} }, @@ -247,10 +345,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.1688375438343395, - "x2": 0.8857473844640396, - "y2": 0.1806557256525213 + "x1": 0.7840970028147978, + "y1": 0.16840230768377132, + "x2": 0.8876264145795036, + "y2": 0.1815841258655895 }, "properties": {} }, @@ -264,10 +362,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.1797466347434304, - "x2": 0.5186885609346278, - "y2": 0.19247390747070312 + "x1": 0.09115582634420956, + "y1": 0.17976594404740767, + "x2": 0.5158617086971508, + "y2": 0.1934023076837713 }, "properties": {} }, @@ -281,15 +379,15 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.1797466347434304, - "x2": 0.6622179726993337, - "y2": 0.19247390747070312 + "x1": 0.5611558263442096, + "y1": 0.17976594404740767, + "x2": 0.6635087675206801, + "y2": 0.1934023076837713 }, "properties": {} }, { - "content": "967)", + "content": "(967)", "rows": [ 5 ], @@ -298,10 +396,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.1797466347434304, - "x2": 0.7751591491699219, - "y2": 0.19247390747070312 + "x1": 0.6746852381089155, + "y1": 0.17976594404740767, + "x2": 0.7758617086971508, + "y2": 0.1934023076837713 }, "properties": {} }, @@ -315,10 +413,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.1797466347434304, - "x2": 0.8857473844640396, - "y2": 0.19247390747070312 + "x1": 0.7840970028147978, + "y1": 0.17976594404740767, + "x2": 0.8876264145795036, + "y2": 0.1934023076837713 }, "properties": {} }, @@ -332,10 +430,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.1906557256525213, - "x2": 0.5186885609346278, - "y2": 0.20429208928888495 + "x1": 0.09115582634420956, + "y1": 0.19158412586558948, + "x2": 0.5158617086971508, + "y2": 0.20385685313831675 }, "properties": {} }, @@ -349,10 +447,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.1906557256525213, - "x2": 0.6622179726993337, - "y2": 0.20429208928888495 + "x1": 0.5611558263442096, + "y1": 0.19158412586558948, + "x2": 0.6635087675206801, + "y2": 0.20385685313831675 }, "properties": {} }, @@ -366,10 +464,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.1906557256525213, - "x2": 0.7751591491699219, - "y2": 0.20429208928888495 + "x1": 0.6746852381089155, + "y1": 0.19158412586558948, + "x2": 0.7758617086971508, + "y2": 0.20385685313831675 }, "properties": {} }, @@ -383,10 +481,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.1906557256525213, - "x2": 0.8857473844640396, - "y2": 0.20429208928888495 + "x1": 0.7840970028147978, + "y1": 0.19158412586558948, + "x2": 0.8876264145795036, + "y2": 0.20385685313831675 }, "properties": {} }, @@ -400,10 +498,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.20247390747070312, - "x2": 0.5186885609346278, - "y2": 0.21520118019797585 + "x1": 0.09115582634420956, + "y1": 0.20203867132013495, + "x2": 0.5158617086971508, + "y2": 0.2156750349564986 }, "properties": {} }, @@ -417,10 +515,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.20247390747070312, - "x2": 0.6622179726993337, - "y2": 0.21520118019797585 + "x1": 0.5611558263442096, + "y1": 0.20203867132013495, + "x2": 0.6635087675206801, + "y2": 0.2156750349564986 }, "properties": {} }, @@ -434,10 +532,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.20247390747070312, - "x2": 0.7751591491699219, - "y2": 0.21520118019797585 + "x1": 0.6746852381089155, + "y1": 0.20203867132013495, + "x2": 0.7758617086971508, + "y2": 0.2156750349564986 }, "properties": {} }, @@ -451,10 +549,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.20247390747070312, - "x2": 0.8857473844640396, - "y2": 0.21520118019797585 + "x1": 0.7840970028147978, + "y1": 0.20203867132013495, + "x2": 0.8876264145795036, + "y2": 0.2156750349564986 }, "properties": {} }, @@ -468,10 +566,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.21338299837979405, - "x2": 0.5186885609346278, - "y2": 0.22838299837979403 + "x1": 0.09115582634420956, + "y1": 0.21431139859286222, + "x2": 0.5158617086971508, + "y2": 0.2274932167746804 }, "properties": {} }, @@ -485,10 +583,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.21338299837979405, - "x2": 0.6622179726993337, - "y2": 0.22838299837979403 + "x1": 0.5611558263442096, + "y1": 0.21431139859286222, + "x2": 0.6635087675206801, + "y2": 0.2274932167746804 }, "properties": {} }, @@ -502,10 +600,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.21338299837979405, - "x2": 0.7751591491699219, - "y2": 0.22838299837979403 + "x1": 0.6746852381089155, + "y1": 0.21431139859286222, + "x2": 0.7758617086971508, + "y2": 0.2274932167746804 }, "properties": {} }, @@ -519,10 +617,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.21338299837979405, - "x2": 0.8857473844640396, - "y2": 0.22838299837979403 + "x1": 0.7840970028147978, + "y1": 0.21431139859286222, + "x2": 0.8876264145795036, + "y2": 0.2274932167746804 }, "properties": {} }, @@ -536,10 +634,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.22520118019797586, - "x2": 0.5186885609346278, - "y2": 0.23701936201615767 + "x1": 0.09115582634420956, + "y1": 0.22612958041104403, + "x2": 0.5158617086971508, + "y2": 0.2384023076837713 }, "properties": {} }, @@ -553,10 +651,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.22520118019797586, - "x2": 0.6622179726993337, - "y2": 0.23701936201615767 + "x1": 0.5611558263442096, + "y1": 0.22612958041104403, + "x2": 0.6635087675206801, + "y2": 0.2384023076837713 }, "properties": {} }, @@ -570,15 +668,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.22520118019797586, - "x2": 0.7751591491699219, - "y2": 0.23701936201615767 + "x1": 0.6746852381089155, + "y1": 0.22612958041104403, + "x2": 0.7758617086971508, + "y2": 0.2384023076837713 }, "properties": {} }, { - "content": "", + "content": "7", "rows": [ 9 ], @@ -587,15 +685,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.22520118019797586, - "x2": 0.8857473844640396, - "y2": 0.23701936201615767 + "x1": 0.7840970028147978, + "y1": 0.22612958041104403, + "x2": 0.8876264145795036, + "y2": 0.2384023076837713 }, "properties": {} }, { - "content": "Changes in assets and liabilities", + "content": "Changes in assets and liabilitie", "rows": [ 10 ], @@ -607,10 +705,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.23611027110706675, - "x2": 0.8857473844640396, - "y2": 0.2502011801979758 + "x1": 0.09115582634420956, + "y1": 0.23794776222922584, + "x2": 0.8876264145795036, + "y2": 0.24703867132013493 }, "properties": {} }, @@ -624,10 +722,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.24883754383433948, - "x2": 0.5186885609346278, - "y2": 0.2597466347434304 + "x1": 0.09115582634420956, + "y1": 0.2484023076837713, + "x2": 0.5158617086971508, + "y2": 0.2615841258655895 }, "properties": {} }, @@ -641,10 +739,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.24883754383433948, - "x2": 0.6622179726993337, - "y2": 0.2597466347434304 + "x1": 0.5611558263442096, + "y1": 0.2484023076837713, + "x2": 0.6635087675206801, + "y2": 0.2615841258655895 }, "properties": {} }, @@ -658,10 +756,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.24883754383433948, - "x2": 0.7751591491699219, - "y2": 0.2597466347434304 + "x1": 0.6746852381089155, + "y1": 0.2484023076837713, + "x2": 0.7758617086971508, + "y2": 0.2615841258655895 }, "properties": {} }, @@ -675,10 +773,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.24883754383433948, - "x2": 0.8857473844640396, - "y2": 0.2597466347434304 + "x1": 0.7840970028147978, + "y1": 0.2484023076837713, + "x2": 0.8876264145795036, + "y2": 0.2615841258655895 }, "properties": {} }, @@ -692,10 +790,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.2597466347434304, - "x2": 0.5186885609346278, - "y2": 0.27065572565252133 + "x1": 0.09115582634420956, + "y1": 0.25976594404740766, + "x2": 0.5158617086971508, + "y2": 0.27203867132013493 }, "properties": {} }, @@ -709,10 +807,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.2597466347434304, - "x2": 0.6622179726993337, - "y2": 0.27065572565252133 + "x1": 0.5611558263442096, + "y1": 0.25976594404740766, + "x2": 0.6635087675206801, + "y2": 0.27203867132013493 }, "properties": {} }, @@ -726,10 +824,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.2597466347434304, - "x2": 0.7751591491699219, - "y2": 0.27065572565252133 + "x1": 0.6746852381089155, + "y1": 0.25976594404740766, + "x2": 0.7758617086971508, + "y2": 0.27203867132013493 }, "properties": {} }, @@ -743,10 +841,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.2597466347434304, - "x2": 0.8857473844640396, - "y2": 0.27065572565252133 + "x1": 0.7840970028147978, + "y1": 0.25976594404740766, + "x2": 0.8876264145795036, + "y2": 0.27203867132013493 }, "properties": {} }, @@ -760,10 +858,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.27065572565252133, - "x2": 0.5186885609346278, - "y2": 0.2829284529252486 + "x1": 0.09115582634420956, + "y1": 0.271129580411044, + "x2": 0.5158617086971508, + "y2": 0.2834023076837713 }, "properties": {} }, @@ -777,10 +875,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.27065572565252133, - "x2": 0.6622179726993337, - "y2": 0.2829284529252486 + "x1": 0.5611558263442096, + "y1": 0.271129580411044, + "x2": 0.6635087675206801, + "y2": 0.2834023076837713 }, "properties": {} }, @@ -794,10 +892,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.27065572565252133, - "x2": 0.7751591491699219, - "y2": 0.2829284529252486 + "x1": 0.6746852381089155, + "y1": 0.271129580411044, + "x2": 0.7758617086971508, + "y2": 0.2834023076837713 }, "properties": {} }, @@ -811,15 +909,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.27065572565252133, - "x2": 0.8857473844640396, - "y2": 0.2829284529252486 + "x1": 0.7840970028147978, + "y1": 0.271129580411044, + "x2": 0.8876264145795036, + "y2": 0.2834023076837713 }, "properties": {} }, { - "content": "Accrued income taxes current and term) long-'", + "content": "Accrued income taxes (current and long-term)", "rows": [ 14 ], @@ -828,10 +926,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.28073021704121276, - "x2": 0.5186885609346278, - "y2": 0.29649032517292073 + "x1": 0.09115582634420956, + "y1": 0.2824932167746804, + "x2": 0.5158617086971508, + "y2": 0.2947659440474077 }, "properties": {} }, @@ -845,10 +943,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.28073021704121276, - "x2": 0.6622179726993337, - "y2": 0.29649032517292073 + "x1": 0.5611558263442096, + "y1": 0.2824932167746804, + "x2": 0.6635087675206801, + "y2": 0.2947659440474077 }, "properties": {} }, @@ -862,10 +960,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.28073021704121276, - "x2": 0.7751591491699219, - "y2": 0.29649032517292073 + "x1": 0.6746852381089155, + "y1": 0.2824932167746804, + "x2": 0.7758617086971508, + "y2": 0.2947659440474077 }, "properties": {} }, @@ -879,15 +977,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.28073021704121276, - "x2": 0.8857473844640396, - "y2": 0.29649032517292073 + "x1": 0.7840970028147978, + "y1": 0.2824932167746804, + "x2": 0.8876264145795036, + "y2": 0.2947659440474077 }, "properties": {} }, { - "content": "Other net", + "content": "Othernet", "rows": [ 15 ], @@ -896,10 +994,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.29338299837979404, - "x2": 0.5186885609346278, - "y2": 0.30429208928888496 + "x1": 0.09115582634420956, + "y1": 0.2934023076837713, + "x2": 0.5158617086971508, + "y2": 0.3065841258655895 }, "properties": {} }, @@ -913,10 +1011,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.29338299837979404, - "x2": 0.6622179726993337, - "y2": 0.30429208928888496 + "x1": 0.5611558263442096, + "y1": 0.2934023076837713, + "x2": 0.6635087675206801, + "y2": 0.3065841258655895 }, "properties": {} }, @@ -930,10 +1028,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.29338299837979404, - "x2": 0.7751591491699219, - "y2": 0.30429208928888496 + "x1": 0.6746852381089155, + "y1": 0.2934023076837713, + "x2": 0.7758617086971508, + "y2": 0.3065841258655895 }, "properties": {} }, @@ -947,15 +1045,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.29338299837979404, - "x2": 0.8857473844640396, - "y2": 0.30429208928888496 + "x1": 0.7840970028147978, + "y1": 0.2934023076837713, + "x2": 0.8876264145795036, + "y2": 0.3065841258655895 }, "properties": {} }, { - "content": "Net cash provided by (used in) operating activities", + "content": "Net cash provided by (used in) operating activities.", "rows": [ 16 ], @@ -964,10 +1062,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.3047466347434304, - "x2": 0.5186885609346278, - "y2": 0.3188375438343395 + "x1": 0.09115582634420956, + "y1": 0.3065841258655895, + "x2": 0.5158617086971508, + "y2": 0.3179477622292258 }, "properties": {} }, @@ -981,10 +1079,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.3047466347434304, - "x2": 0.6622179726993337, - "y2": 0.3188375438343395 + "x1": 0.5611558263442096, + "y1": 0.3065841258655895, + "x2": 0.6635087675206801, + "y2": 0.3179477622292258 }, "properties": {} }, @@ -998,15 +1096,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.3047466347434304, - "x2": 0.7751591491699219, - "y2": 0.3188375438343395 + "x1": 0.6746852381089155, + "y1": 0.3065841258655895, + "x2": 0.7758617086971508, + "y2": 0.3179477622292258 }, "properties": {} }, { - "content": "66_", + "content": "6,662", "rows": [ 16 ], @@ -1015,15 +1113,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.3047466347434304, - "x2": 0.8857473844640396, - "y2": 0.3188375438343395 + "x1": 0.7840970028147978, + "y1": 0.3065841258655895, + "x2": 0.8876264145795036, + "y2": 0.3179477622292258 }, "properties": {} }, { - "content": "Cash Flows from Investing Activities", + "content": "vities", "rows": [ 17 ], @@ -1035,10 +1133,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.3279284529252486, - "x2": 0.8857473844640396, - "y2": 0.3424739074707031 + "x1": 0.09115582634420956, + "y1": 0.32976594404740767, + "x2": 0.8876264145795036, + "y2": 0.3374932167746804 }, "properties": {} }, @@ -1052,10 +1150,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.3406557256525213, - "x2": 0.5186885609346278, - "y2": 0.35338299837979403 + "x1": 0.09115582634420956, + "y1": 0.3397659440474077, + "x2": 0.5158617086971508, + "y2": 0.3538568531383168 }, "properties": {} }, @@ -1069,10 +1167,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.3406557256525213, - "x2": 0.6622179726993337, - "y2": 0.35338299837979403 + "x1": 0.5611558263442096, + "y1": 0.3397659440474077, + "x2": 0.6635087675206801, + "y2": 0.3538568531383168 }, "properties": {} }, @@ -1086,15 +1184,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.3406557256525213, - "x2": 0.7751591491699219, - "y2": 0.35338299837979403 + "x1": 0.6746852381089155, + "y1": 0.3397659440474077, + "x2": 0.7758617086971508, + "y2": 0.3538568531383168 }, "properties": {} }, { - "content": "1,420)", + "content": "(1,420)", "rows": [ 18 ], @@ -1103,10 +1201,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.3406557256525213, - "x2": 0.8857473844640396, - "y2": 0.35338299837979403 + "x1": 0.7840970028147978, + "y1": 0.3397659440474077, + "x2": 0.8876264145795036, + "y2": 0.3538568531383168 }, "properties": {} }, @@ -1120,10 +1218,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.3524739074707031, - "x2": 0.5186885609346278, - "y2": 0.36338299837979404 + "x1": 0.09115582634420956, + "y1": 0.35203867132013494, + "x2": 0.5158617086971508, + "y2": 0.3652204895019531 }, "properties": {} }, @@ -1137,10 +1235,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.3524739074707031, - "x2": 0.6622179726993337, - "y2": 0.36338299837979404 + "x1": 0.5611558263442096, + "y1": 0.35203867132013494, + "x2": 0.6635087675206801, + "y2": 0.3652204895019531 }, "properties": {} }, @@ -1154,10 +1252,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.3524739074707031, - "x2": 0.7751591491699219, - "y2": 0.36338299837979404 + "x1": 0.6746852381089155, + "y1": 0.35203867132013494, + "x2": 0.7758617086971508, + "y2": 0.3652204895019531 }, "properties": {} }, @@ -1171,15 +1269,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.3524739074707031, - "x2": 0.8857473844640396, - "y2": 0.36338299837979404 + "x1": 0.7840970028147978, + "y1": 0.35203867132013494, + "x2": 0.8876264145795036, + "y2": 0.3652204895019531 }, "properties": {} }, { - "content": "Acquisitions net of cash acquired", + "content": "Acquisitions, net of cash acquired.", "rows": [ 20 ], @@ -1188,10 +1286,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.3624739074707031, - "x2": 0.5186885609346278, - "y2": 0.3756557256525213 + "x1": 0.09115582634420956, + "y1": 0.3638568531383168, + "x2": 0.5158617086971508, + "y2": 0.37612958041104405 }, "properties": {} }, @@ -1205,10 +1303,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.3624739074707031, - "x2": 0.6622179726993337, - "y2": 0.3756557256525213 + "x1": 0.5611558263442096, + "y1": 0.3638568531383168, + "x2": 0.6635087675206801, + "y2": 0.37612958041104405 }, "properties": {} }, @@ -1222,10 +1320,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.3624739074707031, - "x2": 0.7751591491699219, - "y2": 0.3756557256525213 + "x1": 0.6746852381089155, + "y1": 0.3638568531383168, + "x2": 0.7758617086971508, + "y2": 0.37612958041104405 }, "properties": {} }, @@ -1239,10 +1337,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.3624739074707031, - "x2": 0.8857473844640396, - "y2": 0.3756557256525213 + "x1": 0.7840970028147978, + "y1": 0.3638568531383168, + "x2": 0.8876264145795036, + "y2": 0.37612958041104405 }, "properties": {} }, @@ -1256,10 +1354,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.3747466347434304, - "x2": 0.5186885609346278, - "y2": 0.38701936201615766 + "x1": 0.09115582634420956, + "y1": 0.37476594404740765, + "x2": 0.5158617086971508, + "y2": 0.38794776222922583 }, "properties": {} }, @@ -1273,10 +1371,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.3747466347434304, - "x2": 0.6622179726993337, - "y2": 0.38701936201615766 + "x1": 0.5611558263442096, + "y1": 0.37476594404740765, + "x2": 0.6635087675206801, + "y2": 0.38794776222922583 }, "properties": {} }, @@ -1290,10 +1388,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.3747466347434304, - "x2": 0.7751591491699219, - "y2": 0.38701936201615766 + "x1": 0.6746852381089155, + "y1": 0.37476594404740765, + "x2": 0.7758617086971508, + "y2": 0.38794776222922583 }, "properties": {} }, @@ -1307,10 +1405,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.3747466347434304, - "x2": 0.8857473844640396, - "y2": 0.38701936201615766 + "x1": 0.7840970028147978, + "y1": 0.37476594404740765, + "x2": 0.8876264145795036, + "y2": 0.38794776222922583 }, "properties": {} }, @@ -1324,10 +1422,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.38611027110706675, - "x2": 0.5186885609346278, - "y2": 0.3979284529252486 + "x1": 0.09115582634420956, + "y1": 0.38612958041104406, + "x2": 0.5158617086971508, + "y2": 0.3997659440474077 }, "properties": {} }, @@ -1341,10 +1439,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.38611027110706675, - "x2": 0.6622179726993337, - "y2": 0.3979284529252486 + "x1": 0.5611558263442096, + "y1": 0.38612958041104406, + "x2": 0.6635087675206801, + "y2": 0.3997659440474077 }, "properties": {} }, @@ -1358,10 +1456,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.38611027110706675, - "x2": 0.7751591491699219, - "y2": 0.3979284529252486 + "x1": 0.6746852381089155, + "y1": 0.38612958041104406, + "x2": 0.7758617086971508, + "y2": 0.3997659440474077 }, "properties": {} }, @@ -1375,10 +1473,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.38611027110706675, - "x2": 0.8857473844640396, - "y2": 0.3979284529252486 + "x1": 0.7840970028147978, + "y1": 0.38612958041104406, + "x2": 0.8876264145795036, + "y2": 0.3997659440474077 }, "properties": {} }, @@ -1392,10 +1490,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.3974739074707031, - "x2": 0.5186885609346278, - "y2": 0.41429208928888495 + "x1": 0.09115582634420956, + "y1": 0.39840230768377133, + "x2": 0.5158617086971508, + "y2": 0.4147659440474077 }, "properties": {} }, @@ -1409,10 +1507,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.3974739074707031, - "x2": 0.6622179726993337, - "y2": 0.41429208928888495 + "x1": 0.5611558263442096, + "y1": 0.39840230768377133, + "x2": 0.6635087675206801, + "y2": 0.4147659440474077 }, "properties": {} }, @@ -1426,10 +1524,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.3974739074707031, - "x2": 0.7751591491699219, - "y2": 0.41429208928888495 + "x1": 0.6746852381089155, + "y1": 0.39840230768377133, + "x2": 0.7758617086971508, + "y2": 0.4147659440474077 }, "properties": {} }, @@ -1443,15 +1541,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.3974739074707031, - "x2": 0.8857473844640396, - "y2": 0.41429208928888495 + "x1": 0.7840970028147978, + "y1": 0.39840230768377133, + "x2": 0.8876264145795036, + "y2": 0.4147659440474077 }, "properties": {} }, { - "content": "Other net", + "content": "Other-net", "rows": [ 24 ], @@ -1460,15 +1558,15 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.41338299837979403, - "x2": 0.5186885609346278, - "y2": 0.42429208928888495 + "x1": 0.09115582634420956, + "y1": 0.41385685313831677, + "x2": 0.5158617086971508, + "y2": 0.42612958041104404 }, "properties": {} }, { - "content": "", + "content": "9", "rows": [ 24 ], @@ -1477,15 +1575,15 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.41338299837979403, - "x2": 0.6622179726993337, - "y2": 0.42429208928888495 + "x1": 0.5611558263442096, + "y1": 0.41385685313831677, + "x2": 0.6635087675206801, + "y2": 0.42612958041104404 }, "properties": {} }, { - "content": "", + "content": "(6)", "rows": [ 24 ], @@ -1494,15 +1592,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.41338299837979403, - "x2": 0.7751591491699219, - "y2": 0.42429208928888495 + "x1": 0.6746852381089155, + "y1": 0.41385685313831677, + "x2": 0.7758617086971508, + "y2": 0.42612958041104404 }, "properties": {} }, { - "content": "", + "content": "(4)", "rows": [ 24 ], @@ -1511,10 +1609,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.41338299837979403, - "x2": 0.8857473844640396, - "y2": 0.42429208928888495 + "x1": 0.7840970028147978, + "y1": 0.41385685313831677, + "x2": 0.8876264145795036, + "y2": 0.42612958041104404 }, "properties": {} }, @@ -1528,10 +1626,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.42429208928888495, - "x2": 0.5186885609346278, - "y2": 0.43792845292524857 + "x1": 0.09115582634420956, + "y1": 0.4252204895019531, + "x2": 0.5158617086971508, + "y2": 0.4384023076837713 }, "properties": {} }, @@ -1545,15 +1643,15 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.42429208928888495, - "x2": 0.6622179726993337, - "y2": 0.43792845292524857 + "x1": 0.5611558263442096, + "y1": 0.4252204895019531, + "x2": 0.6635087675206801, + "y2": 0.4384023076837713 }, "properties": {} }, { - "content": "(3,086", + "content": "(3,086)", "rows": [ 25 ], @@ -1562,15 +1660,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.42429208928888495, - "x2": 0.7751591491699219, - "y2": 0.43792845292524857 + "x1": 0.6746852381089155, + "y1": 0.4252204895019531, + "x2": 0.7758617086971508, + "y2": 0.4384023076837713 }, "properties": {} }, { - "content": "1.403)", + "content": "(1,403)", "rows": [ 25 ], @@ -1579,10 +1677,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.42429208928888495, - "x2": 0.8857473844640396, - "y2": 0.43792845292524857 + "x1": 0.7840970028147978, + "y1": 0.4252204895019531, + "x2": 0.8876264145795036, + "y2": 0.4384023076837713 }, "properties": {} }, @@ -1599,15 +1697,15 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.448382998379794, - "x2": 0.8857473844640396, - "y2": 0.4615648165616122 + "x1": 0.09115582634420956, + "y1": 0.44885685313831675, + "x2": 0.8876264145795036, + "y2": 0.4606750349564986 }, "properties": {} }, { - "content": "Change in short-term debt net", + "content": "Change in short-term debt - net", "rows": [ 27 ], @@ -1616,10 +1714,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.4597466347434304, - "x2": 0.5186885609346278, - "y2": 0.4738375438343395 + "x1": 0.09115582634420956, + "y1": 0.45931139859286224, + "x2": 0.5158617086971508, + "y2": 0.47385685313831677 }, "properties": {} }, @@ -1633,10 +1731,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.4597466347434304, - "x2": 0.6622179726993337, - "y2": 0.4738375438343395 + "x1": 0.5611558263442096, + "y1": 0.45931139859286224, + "x2": 0.6635087675206801, + "y2": 0.47385685313831677 }, "properties": {} }, @@ -1650,15 +1748,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.4597466347434304, - "x2": 0.7751591491699219, - "y2": 0.4738375438343395 + "x1": 0.6746852381089155, + "y1": 0.45931139859286224, + "x2": 0.7758617086971508, + "y2": 0.47385685313831677 }, "properties": {} }, { - "content": "797", + "content": "(797)", "rows": [ 27 ], @@ -1667,10 +1765,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.4597466347434304, - "x2": 0.8857473844640396, - "y2": 0.4738375438343395 + "x1": 0.7840970028147978, + "y1": 0.45931139859286224, + "x2": 0.8876264145795036, + "y2": 0.47385685313831677 }, "properties": {} }, @@ -1684,10 +1782,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.4706557256525213, - "x2": 0.5186885609346278, - "y2": 0.4847466347434304 + "x1": 0.09115582634420956, + "y1": 0.4715841258655895, + "x2": 0.5158617086971508, + "y2": 0.4847659440474077 }, "properties": {} }, @@ -1701,10 +1799,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.4706557256525213, - "x2": 0.6622179726993337, - "y2": 0.4847466347434304 + "x1": 0.5611558263442096, + "y1": 0.4715841258655895, + "x2": 0.6635087675206801, + "y2": 0.4847659440474077 }, "properties": {} }, @@ -1718,15 +1816,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.4706557256525213, - "x2": 0.7751591491699219, - "y2": 0.4847466347434304 + "x1": 0.6746852381089155, + "y1": 0.4715841258655895, + "x2": 0.7758617086971508, + "y2": 0.4847659440474077 }, "properties": {} }, { - "content": "992)", + "content": "(992)", "rows": [ 28 ], @@ -1735,15 +1833,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.4706557256525213, - "x2": 0.8857473844640396, - "y2": 0.4847466347434304 + "x1": 0.7840970028147978, + "y1": 0.4715841258655895, + "x2": 0.8876264145795036, + "y2": 0.4847659440474077 }, "properties": {} }, { - "content": "Proceeds debt (maturities greater than 90 from days)", + "content": "Proceeds from debt (maturities greater than 90 days)", "rows": [ 29 ], @@ -1752,10 +1850,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.4821102543713353, - "x2": 0.5186885609346278, - "y2": 0.4964739242064346 + "x1": 0.09115582634420956, + "y1": 0.48294776222922586, + "x2": 0.5158617086971508, + "y2": 0.4965841258655895 }, "properties": {} }, @@ -1769,10 +1867,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.4821102543713353, - "x2": 0.6622179726993337, - "y2": 0.4964739242064346 + "x1": 0.5611558263442096, + "y1": 0.48294776222922586, + "x2": 0.6635087675206801, + "y2": 0.4965841258655895 }, "properties": {} }, @@ -1786,10 +1884,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.4821102543713353, - "x2": 0.7751591491699219, - "y2": 0.4964739242064346 + "x1": 0.6746852381089155, + "y1": 0.48294776222922586, + "x2": 0.7758617086971508, + "y2": 0.4965841258655895 }, "properties": {} }, @@ -1803,10 +1901,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.4821102543713353, - "x2": 0.8857473844640396, - "y2": 0.4964739242064346 + "x1": 0.7840970028147978, + "y1": 0.48294776222922586, + "x2": 0.8876264145795036, + "y2": 0.4965841258655895 }, "properties": {} }, @@ -1820,10 +1918,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.49338299837979405, - "x2": 0.5186885609346278, - "y2": 0.5070193620161577 + "x1": 0.09115582634420956, + "y1": 0.49476594404740765, + "x2": 0.5158617086971508, + "y2": 0.5079477622292259 }, "properties": {} }, @@ -1837,15 +1935,15 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.49338299837979405, - "x2": 0.6622179726993337, - "y2": 0.5070193620161577 + "x1": 0.5611558263442096, + "y1": 0.49476594404740765, + "x2": 0.6635087675206801, + "y2": 0.5079477622292259 }, "properties": {} }, { - "content": "(2,068", + "content": "(2,068)", "rows": [ 30 ], @@ -1854,10 +1952,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.49338299837979405, - "x2": 0.7751591491699219, - "y2": 0.5070193620161577 + "x1": 0.6746852381089155, + "y1": 0.49476594404740765, + "x2": 0.7758617086971508, + "y2": 0.5079477622292259 }, "properties": {} }, @@ -1871,10 +1969,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.49338299837979405, - "x2": 0.8857473844640396, - "y2": 0.5070193620161577 + "x1": 0.7840970028147978, + "y1": 0.49476594404740765, + "x2": 0.8876264145795036, + "y2": 0.5079477622292259 }, "properties": {} }, @@ -1888,10 +1986,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.5056557256525213, - "x2": 0.5186885609346278, - "y2": 0.5179284529252486 + "x1": 0.09115582634420956, + "y1": 0.506129580411044, + "x2": 0.5158617086971508, + "y2": 0.5179477622292259 }, "properties": {} }, @@ -1905,10 +2003,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.5056557256525213, - "x2": 0.6622179726993337, - "y2": 0.5179284529252486 + "x1": 0.5611558263442096, + "y1": 0.506129580411044, + "x2": 0.6635087675206801, + "y2": 0.5179477622292259 }, "properties": {} }, @@ -1922,10 +2020,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.5056557256525213, - "x2": 0.7751591491699219, - "y2": 0.5179284529252486 + "x1": 0.6746852381089155, + "y1": 0.506129580411044, + "x2": 0.7758617086971508, + "y2": 0.5179477622292259 }, "properties": {} }, @@ -1939,10 +2037,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.5056557256525213, - "x2": 0.8857473844640396, - "y2": 0.5179284529252486 + "x1": 0.7840970028147978, + "y1": 0.506129580411044, + "x2": 0.8876264145795036, + "y2": 0.5179477622292259 }, "properties": {} }, @@ -1956,10 +2054,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.5161102711070668, - "x2": 0.5186885609346278, - "y2": 0.5292920892888849 + "x1": 0.09115582634420956, + "y1": 0.5174932167746804, + "x2": 0.5158617086971508, + "y2": 0.5302204895019531 }, "properties": {} }, @@ -1973,15 +2071,15 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.5161102711070668, - "x2": 0.6622179726993337, - "y2": 0.5292920892888849 + "x1": 0.5611558263442096, + "y1": 0.5174932167746804, + "x2": 0.6635087675206801, + "y2": 0.5302204895019531 }, "properties": {} }, { - "content": "(2,803_", + "content": "(2,803)", "rows": [ 32 ], @@ -1990,15 +2088,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.5161102711070668, - "x2": 0.7751591491699219, - "y2": 0.5292920892888849 + "x1": 0.6746852381089155, + "y1": 0.5174932167746804, + "x2": 0.7758617086971508, + "y2": 0.5302204895019531 }, "properties": {} }, { - "content": "(2,678", + "content": "(2,678)", "rows": [ 32 ], @@ -2007,15 +2105,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.5161102711070668, - "x2": 0.8857473844640396, - "y2": 0.5292920892888849 + "x1": 0.7840970028147978, + "y1": 0.5174932167746804, + "x2": 0.8876264145795036, + "y2": 0.5302204895019531 }, "properties": {} }, { - "content": "Other net", + "content": "Other -net", "rows": [ 33 ], @@ -2024,10 +2122,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.5288375438343395, - "x2": 0.5186885609346278, - "y2": 0.5397466347434304 + "x1": 0.09115582634420956, + "y1": 0.5293113985928622, + "x2": 0.5158617086971508, + "y2": 0.5411295804110441 }, "properties": {} }, @@ -2041,10 +2139,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.5288375438343395, - "x2": 0.6622179726993337, - "y2": 0.5397466347434304 + "x1": 0.5611558263442096, + "y1": 0.5293113985928622, + "x2": 0.6635087675206801, + "y2": 0.5411295804110441 }, "properties": {} }, @@ -2058,15 +2156,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.5288375438343395, - "x2": 0.7751591491699219, - "y2": 0.5397466347434304 + "x1": 0.6746852381089155, + "y1": 0.5293113985928622, + "x2": 0.7758617086971508, + "y2": 0.5411295804110441 }, "properties": {} }, { - "content": "42)", + "content": "(42)", "rows": [ 33 ], @@ -2075,10 +2173,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.5288375438343395, - "x2": 0.8857473844640396, - "y2": 0.5397466347434304 + "x1": 0.7840970028147978, + "y1": 0.5293113985928622, + "x2": 0.8876264145795036, + "y2": 0.5411295804110441 }, "properties": {} }, @@ -2092,15 +2190,15 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.5397466347434304, - "x2": 0.5186885609346278, - "y2": 0.553382998379794 + "x1": 0.09115582634420956, + "y1": 0.5411295804110441, + "x2": 0.5158617086971508, + "y2": 0.5543113985928623 }, "properties": {} }, { - "content": "6,701)", + "content": "(6,701)", "rows": [ 34 ], @@ -2109,15 +2207,15 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.5397466347434304, - "x2": 0.6622179726993337, - "y2": 0.553382998379794 + "x1": 0.5611558263442096, + "y1": 0.5411295804110441, + "x2": 0.6635087675206801, + "y2": 0.5543113985928623 }, "properties": {} }, { - "content": "(2655)", + "content": "(2,655)", "rows": [ 34 ], @@ -2126,15 +2224,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.5397466347434304, - "x2": 0.7751591491699219, - "y2": 0.553382998379794 + "x1": 0.6746852381089155, + "y1": 0.5411295804110441, + "x2": 0.7758617086971508, + "y2": 0.5543113985928623 }, "properties": {} }, { - "content": "4626)", + "content": "(4,626)", "rows": [ 34 ], @@ -2143,10 +2241,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.5397466347434304, - "x2": 0.8857473844640396, - "y2": 0.553382998379794 + "x1": 0.7840970028147978, + "y1": 0.5411295804110441, + "x2": 0.8876264145795036, + "y2": 0.5543113985928623 }, "properties": {} }, @@ -2160,10 +2258,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.5638375438343395, - "x2": 0.5186885609346278, - "y2": 0.5774739074707032 + "x1": 0.09115582634420956, + "y1": 0.5652204895019531, + "x2": 0.5158617086971508, + "y2": 0.5774932167746804 }, "properties": {} }, @@ -2177,10 +2275,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.5638375438343395, - "x2": 0.6622179726993337, - "y2": 0.5774739074707032 + "x1": 0.5611558263442096, + "y1": 0.5652204895019531, + "x2": 0.6635087675206801, + "y2": 0.5774932167746804 }, "properties": {} }, @@ -2194,15 +2292,15 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.5638375438343395, - "x2": 0.7751591491699219, - "y2": 0.5774739074707032 + "x1": 0.6746852381089155, + "y1": 0.5652204895019531, + "x2": 0.7758617086971508, + "y2": 0.5774932167746804 }, "properties": {} }, { - "content": "33", + "content": "(33)", "rows": [ 35 ], @@ -2211,15 +2309,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.5638375438343395, - "x2": 0.8857473844640396, - "y2": 0.5774739074707032 + "x1": 0.7840970028147978, + "y1": 0.5652204895019531, + "x2": 0.8876264145795036, + "y2": 0.5774932167746804 }, "properties": {} }, { - "content": "Net increase (decrease) in cash and cash equivalents", + "content": "Net increase (decrease) in cash and cash equivalents.", "rows": [ 36 ], @@ -2228,10 +2326,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.5870193620161577, - "x2": 0.5186885609346278, - "y2": 0.5997466347434304 + "x1": 0.09115582634420956, + "y1": 0.5884023076837713, + "x2": 0.5158617086971508, + "y2": 0.6002204895019532 }, "properties": {} }, @@ -2245,10 +2343,10 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.5870193620161577, - "x2": 0.6622179726993337, - "y2": 0.5997466347434304 + "x1": 0.5611558263442096, + "y1": 0.5884023076837713, + "x2": 0.6635087675206801, + "y2": 0.6002204895019532 }, "properties": {} }, @@ -2262,10 +2360,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.5870193620161577, - "x2": 0.7751591491699219, - "y2": 0.5997466347434304 + "x1": 0.6746852381089155, + "y1": 0.5884023076837713, + "x2": 0.7758617086971508, + "y2": 0.6002204895019532 }, "properties": {} }, @@ -2279,15 +2377,15 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.5870193620161577, - "x2": 0.8857473844640396, - "y2": 0.5997466347434304 + "x1": 0.7840970028147978, + "y1": 0.5884023076837713, + "x2": 0.8876264145795036, + "y2": 0.6002204895019532 }, "properties": {} }, { - "content": "Cash and cash equivalents at beginning of year", + "content": "Cash and cash equivalents at beginning of year.", "rows": [ 37 ], @@ -2296,10 +2394,10 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.5979284529252485, - "x2": 0.5186885609346278, - "y2": 0.6115648165616122 + "x1": 0.09115582634420956, + "y1": 0.5988568531383167, + "x2": 0.5158617086971508, + "y2": 0.611129580411044 }, "properties": {} }, @@ -2313,15 +2411,15 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.5979284529252485, - "x2": 0.6622179726993337, - "y2": 0.6115648165616122 + "x1": 0.5611558263442096, + "y1": 0.5988568531383167, + "x2": 0.6635087675206801, + "y2": 0.611129580411044 }, "properties": {} }, { - "content": "2.398", + "content": "2,398", "rows": [ 37 ], @@ -2330,10 +2428,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.5979284529252485, - "x2": 0.7751591491699219, - "y2": 0.6115648165616122 + "x1": 0.6746852381089155, + "y1": 0.5988568531383167, + "x2": 0.7758617086971508, + "y2": 0.611129580411044 }, "properties": {} }, @@ -2347,10 +2445,10 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.5979284529252485, - "x2": 0.8857473844640396, - "y2": 0.6115648165616122 + "x1": 0.7840970028147978, + "y1": 0.5988568531383167, + "x2": 0.8876264145795036, + "y2": 0.611129580411044 }, "properties": {} }, @@ -2364,15 +2462,15 @@ ], "is_header": false, "bbox": { - "x1": 0.0904532668169807, - "y1": 0.6106557256525214, - "x2": 0.5186885609346278, - "y2": 0.623382998379794 + "x1": 0.09115582634420956, + "y1": 0.6115841258655895, + "x2": 0.5158617086971508, + "y2": 0.6243113985928622 }, "properties": {} }, { - "content": "2,853", + "content": "S 2,853", "rows": [ 38 ], @@ -2381,15 +2479,15 @@ ], "is_header": false, "bbox": { - "x1": 0.5992767962287454, - "y1": 0.6106557256525214, - "x2": 0.6622179726993337, - "y2": 0.623382998379794 + "x1": 0.5611558263442096, + "y1": 0.6115841258655895, + "x2": 0.6635087675206801, + "y2": 0.6243113985928622 }, "properties": {} }, { - "content": "3,053", + "content": "S 3,053", "rows": [ 38 ], @@ -2398,10 +2496,10 @@ ], "is_header": false, "bbox": { - "x1": 0.713394443287569, - "y1": 0.6106557256525214, - "x2": 0.7751591491699219, - "y2": 0.623382998379794 + "x1": 0.6746852381089155, + "y1": 0.6115841258655895, + "x2": 0.7758617086971508, + "y2": 0.6243113985928622 }, "properties": {} }, @@ -2415,46 +2513,52 @@ ], "is_header": false, "bbox": { - "x1": 0.8239826785816866, - "y1": 0.6106557256525214, - "x2": 0.8857473844640396, - "y2": 0.623382998379794 + "x1": 0.7840970028147978, + "y1": 0.6115841258655895, + "x2": 0.8876264145795036, + "y2": 0.6243113985928622 }, "properties": {} } ], "caption": null, "num_rows": 39, - "num_cols": 4 + "num_cols": 4, + "column_headers": [ + "(Millions)", + "2018", + "2017", + "2016" + ] } }, { "type": "Text", "bbox": [ - 0.09334101957433363, - 0.636026777787642, - 0.6066466567095589, - 0.6459264026988636 + 0.09298765294692096, + 0.6364184015447443, + 0.6064737477022059, + 0.6465563409978693 ], "properties": { - "score": 0.8346976041793823, + "score": 0.4158885180950165, "page_number": 1 }, - "text_representation": "The accompanying Notes to Consolidated Financial Statements are an integral part of this statement.\n" + "text_representation": "The accompanying Notes to Consolidated Financial Statements are an integral part of this statement" }, { "type": "Page-footer", "bbox": [ - 0.47960643095128674, - 0.6814282781427556, - 0.4929185216567096, - 0.6909636896306818 + 0.47945628446691174, + 0.6812337979403409, + 0.49324290556066175, + 0.6917808393998579 ], "properties": { - "score": 0.8874315023422241, + "score": 0.908870279788971, "page_number": 1 }, - "text_representation": "" + "text_representation": "60" } ] } diff --git a/lib/aryn-sdk/aryn_sdk/test/resources/json/SPsort_output_images_page1.json b/lib/aryn-sdk/aryn_sdk/test/resources/json/SPsort_output_images_page1.json index 67f377f2f..cf30d0ca0 100644 --- a/lib/aryn-sdk/aryn_sdk/test/resources/json/SPsort_output_images_page1.json +++ b/lib/aryn-sdk/aryn_sdk/test/resources/json/SPsort_output_images_page1.json @@ -4,39 +4,54 @@ "Until you get a line that matches ' ]\n', you can convert the partial", "output to a json document by appending '\"\"]}' to the partial output.", "", - "T+ 0.00: Server version 0.2024.06.28", - "T+ 0.00: Received request with aryn_call_id=6a1d30a9-1f0d-4349-8c00-af329d7fbcc6", + "T+ 0.00: Server version aryn-partitioner-0.20250113.175427 Model version 1.4", + "T+ 0.00: Received request with aryn_call_id=a08a78ea-ccc0-4a01-aa4d-dfe44d7af015", "T+ 0.00: Waiting for scheduling", "T+ 0.00: Preprocessing document", "T+ 0.01: Done preprocessing document", - "T+ 2.61: completed page 1", + "T+ 0.49: Completed work on page 1", "" ], + "status_code": 200, "elements": [ { "type": "Section-header", "bbox": [ - 0.25801759607651653, - 0.14799718683416194, - 0.7434876206341912, - 0.16699282559481535 + 0.25692743637982535, + 0.14604660034179687, + 0.7428384937959559, + 0.16785587657581677 ], "properties": { - "score": 0.4984451234340668, + "score": 0.5503925085067749, "page_number": 1 }, "text_representation": "SPsort: How to Sort a Terabyte Quickly\n" }, + { + "type": "Text", + "bbox": [ + 0.32150031594669115, + 0.19034801136363635, + 0.6775626148897059, + 0.20603222933682527 + ], + "properties": { + "score": 0.4909828007221222, + "page_number": 1 + }, + "text_representation": "Jim Wyllie (wyllie@almaden.ibm.com)\n" + }, { "type": "Section-header", "bbox": [ - 0.43552116842830885, - 0.22252555153586648, - 0.5647090059168198, - 0.2349723399769176 + 0.43477129767922795, + 0.22159348921342328, + 0.5650739602481618, + 0.23526009299538353 ], "properties": { - "score": 0.6633284687995911, + "score": 0.6119033098220825, "page_number": 1 }, "text_representation": "February 4, 1999\n" @@ -44,13 +59,13 @@ { "type": "Section-header", "bbox": [ - 0.1457416399787454, - 0.26848521839488637, - 0.22136041977826287, - 0.28215559525923295 + 0.14695667042451746, + 0.2672817715731534, + 0.22006292006548714, + 0.2824556940252131 ], "properties": { - "score": 0.8485802412033081, + "score": 0.8749006986618042, "page_number": 1 }, "text_representation": "Abstract\n" @@ -58,13 +73,13 @@ { "type": "Text", "bbox": [ - 0.14681899126838235, - 0.30218597412109377, - 0.848895263671875, - 0.41659298983487214 + 0.14688757503733915, + 0.30218639026988636, + 0.84962890625, + 0.4172032304243608 ], "properties": { - "score": 0.9298610091209412, + "score": 0.9318665862083435, "page_number": 1 }, "text_representation": "In December 1998, a 488 node IBM RS/6000 SP* sorted a terabyte of data (10 billion 100 byte records) in\n17 minutes, 37 seconds. This is more than 2.5 times faster than the previous record for a problem of this\nmagnitude. The SPsort program itself was custom-designed for this benchmark, but the cluster, its\ninterconnection hardware, disk subsystem, operating system, file system, communication library, and job\nmanagement software are all IBM products. The system sustained an aggregate data rate of 2.8 GB/s from\nmore than 6 TB of disks managed by the GPFS global shared file system during the sort. Simultaneous\nwith these transfers, 1.9 GB/s of local disk I/O and 5.6 GB/s of interprocessor communication were also\nsustained.\n" @@ -72,13 +87,13 @@ { "type": "Section-header", "bbox": [ - 0.14619633394129136, - 0.45649486194957384, - 0.249862258013557, - 0.47087474476207386 + 0.14624366311465992, + 0.4559353915127841, + 0.25027528650620406, + 0.47113031560724433 ], "properties": { - "score": 0.8512004613876343, + "score": 0.8872892260551453, "page_number": 1 }, "text_representation": "Introduction\n" @@ -86,27 +101,27 @@ { "type": "Text", "bbox": [ - 0.14677959666532628, - 0.4913937655362216, - 0.8547881002987132, - 0.64927001953125 + 0.146956984576057, + 0.49155412153764205, + 0.8547768985523897, + 0.6496059903231534 ], "properties": { - "score": 0.9147736430168152, + "score": 0.9315835237503052, "page_number": 1 }, - "text_representation": "The speed of sorting has long been used as a measure of computer systems I/O and communication\nperformance. In 1985, an article in Datamation magazine proposed a sort of one million records of 100\nbytes each, with random 10 bytes keys, as a useful measure of computer systems I/O performance [1]. The\nground rules of that benchmark require that all input must start on disk, all output must end on disk, and\nthat the overhead to start the program and create the output files must be included in the benchmark time.\nInput and output must use operating system files, not raw disk partitions. The first published time for this\nbenchmark was an hour [12]. With constant improvements in computer hardware and sort algorithms, this\ntime diminished to just a few seconds [7]. At that point, variations on the basic theme evolved [6].\n“MinuteSort” [3, 8] measures how much can be sorted in one minute and “PennySort” [5] measures how\nmuch can be sorted for one cent, assuming a particular depreciation period. Recently, several groups\nreported sorting one terabyte of data [8, 9, 10]. SPsort improves substantially upon the best of these results.\n" + "text_representation": "The speed of sorting has long been used as a measure of computer systems I/O and communication\nperformance. In 1985, an article in Datamation magazine proposed a sort of one million records of 100\nbytes each, with random 10 bytes keys, as a useful measure of computer systems I/O performance [1]. The\nground rules of that benchmark require that all input must start on disk, all output must end on disk, and\nthat the overhead to start the program and create the output files must be included in the benchmark time.\nInput and output must use operating system files, not raw disk partitions. The first published time for this\nbenchmark was an hour [12]. With constant improvements in computer hardware and sort algorithms, this\ntime diminished to just a few seconds [7]. At that point, variations on the basic theme evolved [6].\n\u201cMinuteSort\u201d [3, 8] measures how much can be sorted in one minute and \u201cPennySort\u201d [5] measures how\nmuch can be sorted for one cent, assuming a particular depreciation period. Recently, several groups\nreported sorting one terabyte of data [8, 9, 10]. SPsort improves substantially upon the best of these results.\n" }, { "type": "Section-header", "bbox": [ - 0.14687787224264706, - 0.6754059392755681, - 0.23221774830537684, - 0.6892924915660511 + 0.14693428488338695, + 0.6747088068181818, + 0.23346440932329962, + 0.6892202481356534 ], "properties": { - "score": 0.8540988564491272, + "score": 0.8925763368606567, "page_number": 1 }, "text_representation": "Hardware\n" @@ -114,13 +129,13 @@ { "type": "Text", "bbox": [ - 0.14710727467256435, - 0.7094775945490057, - 0.8550252757352941, - 0.8823457475142046 + 0.14696044024299174, + 0.7098555686257102, + 0.8544048713235294, + 0.882755293412642 ], "properties": { - "score": 0.929555356502533, + "score": 0.9261640906333923, "page_number": 1 }, "text_representation": "The benchmark machine is a 488 node IBM RS/6000 SP, located in the IBM SP system test lab in\nPoughkeepsie, New York. Figure 1 shows the organization of this machine. Each node contains four\n332MHz PowerPC* 604e processors, 1.5 GB of RAM, at least one 32 bit 33 MHz PCI bus, and a 9 GB\nSCSI disk. The nodes communicate with one another through the high-speed SP switch with a bi-\ndirectional link bandwidth to each node of 150 megabytes/second. The switch adapter in each node is\nattached directly to the memory bus, so it does not have to share bandwidth with other devices on the PCI\nbus. Of the 488 nodes, 432 are compute nodes, while the remaining 56 are configured as storage nodes.\nGlobal storage consists of 1680 4.5 GB Serial Storage Architecture (SSA*) disk drives, organized into 336\ntwin-tailed 4+P RAID-5 arrays, for a total of just over 6 TB of user-accessible space attached to the storage\nnodes. Compute nodes are packaged 16 to a rack, while the storage nodes, which have 3 PCI busses and\nconsequently are larger, are packaged 8 to a rack. In total, the CPU and switch hardware occupies 34 racks,\nand the global disks require another 18 racks.\n" From 2ed99a2e250d1dd8cb38272e9fe6352d87d5d7c1 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 16:24:52 -0800 Subject: [PATCH 16/58] Add support for positional arguments in `partition_file_submit_async` --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 8a14af173..1a1717d97 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -12,6 +12,7 @@ from PIL import Image import base64 import io +import inspect # URL for Aryn DocParse ARYN_DOCPARSE_URL = "https://api.aryn.cloud/v1/document/partition" @@ -273,7 +274,7 @@ def _json_options( return json.dumps(options) -def partition_file_submit_async(**kwargs) -> dict: +def partition_file_submit_async(*args, **kwargs) -> dict: """ Submits a file to be partitioned asynchronously. Takes same arguments as partition_file. @@ -296,12 +297,17 @@ def partition_file_submit_async(**kwargs) -> dict: job_id = job["job_id"] """ - async_url = kwargs.get("docparse_url", ARYN_DOCPARSE_URL) - if "/v1/async/submit" not in async_url: - async_url = async_url.replace("/v1/", "/v1/async/submit/") - kwargs["docparse_url"] = async_url - # raise Exception(kwargs["docparse_url"]) - return partition_file(**kwargs) + docparse_url_position = inspect.getfullargspec(partition_file)[0].index("docparse_url") + if len(args) > docparse_url_position: + if "/v1/async/submit" not in args[docparse_url_position]: + args = list(args) + args[docparse_url_position] = args[docparse_url_position].replace("/v1/", "/v1/async/submit/") + else: + async_url = kwargs.get("docparse_url", ARYN_DOCPARSE_URL) + if "/v1/async/submit" not in async_url: + async_url = async_url.replace("/v1/", "/v1/async/submit/") + kwargs["docparse_url"] = async_url + return partition_file(*args, **kwargs) def partition_file_result_async( From aae735617da7c1a6d15b51493afb1e74cfab6aa6 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 16:28:59 -0800 Subject: [PATCH 17/58] Add explanatory comments --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 1a1717d97..24a24112f 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -297,8 +297,10 @@ def partition_file_submit_async(*args, **kwargs) -> dict: job_id = job["job_id"] """ + # Check that the docparse_url is set to the async endpoint. If it's not, then it changes it to the async endpoint + # assuming it was given the correct synchronous endpoint. Uses the default async endpoint if none was provided. docparse_url_position = inspect.getfullargspec(partition_file)[0].index("docparse_url") - if len(args) > docparse_url_position: + if len(args) > docparse_url_position: # Checks if the docparse_url is specified as a positional argument if "/v1/async/submit" not in args[docparse_url_position]: args = list(args) args[docparse_url_position] = args[docparse_url_position].replace("/v1/", "/v1/async/submit/") From bcd92af61a61d81d3d0e5e84ba14a81c6e5f06e9 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 17:08:25 -0800 Subject: [PATCH 18/58] Add support for positional arguments in `partition_file_submit_async` --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 48 ++++++++++++++------ 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 24a24112f..153d0e23e 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -274,9 +274,10 @@ def _json_options( return json.dumps(options) -def partition_file_submit_async(*args, **kwargs) -> dict: +def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) -> dict: """ Submits a file to be partitioned asynchronously. Takes same arguments as partition_file. + Automatically changes the endpoint to the async endpoint, unless force_async_url is set to True. Returns: A dictionary containing "job_id" which can be used with the `partition_file_result_async` @@ -297,18 +298,39 @@ def partition_file_submit_async(*args, **kwargs) -> dict: job_id = job["job_id"] """ - # Check that the docparse_url is set to the async endpoint. If it's not, then it changes it to the async endpoint - # assuming it was given the correct synchronous endpoint. Uses the default async endpoint if none was provided. - docparse_url_position = inspect.getfullargspec(partition_file)[0].index("docparse_url") - if len(args) > docparse_url_position: # Checks if the docparse_url is specified as a positional argument - if "/v1/async/submit" not in args[docparse_url_position]: - args = list(args) - args[docparse_url_position] = args[docparse_url_position].replace("/v1/", "/v1/async/submit/") - else: - async_url = kwargs.get("docparse_url", ARYN_DOCPARSE_URL) - if "/v1/async/submit" not in async_url: - async_url = async_url.replace("/v1/", "/v1/async/submit/") - kwargs["docparse_url"] = async_url + partition_file_full_arg_spec = inspect.getfullargspec(partition_file) + ordered_partition_file_parameter_names = partition_file_full_arg_spec[0] + docparse_url_position = ordered_partition_file_parameter_names.index("docparse_url") + aps_url_position = ordered_partition_file_parameter_names.index("aps_url") + assert aps_url_position < docparse_url_position, "partition_file_submit_async assumes that aps_url comes before docparse_url" + + if not force_async_url: # If force_async_url is set to True, then this function will not change the endpoint + # Check if docparse_url was provided as a positional argument. If it was, then this checks to make sure that + # docparse_url is set to the async endpoint. If docparse_url is specified and it's not set to the async + # endpoint, then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. + if len(args) > docparse_url_position: + if "/v1/async/submit" not in args[docparse_url_position]: + args = list(args) + args[docparse_url_position] = args[docparse_url_position].replace("/v1/", "/v1/async/submit/") + else: + # Check if aps_url was provided as a positional argument. If it was, then this checks to make sure that + # aps_url is set to the async endpoint. If aps_url is specified and it's not set to the async endpoint, + # then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. + if len(args) > aps_url_position: # Checks if the aps_url is specified as a positional argument + if "/v1/async/submit" not in args[aps_url_position]: # Detect if the aps_url is set to the async endpoint + args = list(args) + args[aps_url_position] = args[aps_url_position].replace("/v1/", "/v1/async/submit/") + else: # Neither docparse_url nor aps_url were provided as a positional argument + if "aps_url" in kwargs: + aps_url = kwargs["aps_url"] + assert type(aps_url) == str + if "/v1/async/submit" not in aps_url: + kwargs["aps_url"] = aps_url.replace("/v1/", "/v1/async/submit/") + else: + async_url = kwargs.get("docparse_url", ARYN_DOCPARSE_URL) + if "/v1/async/submit" not in async_url: + async_url = async_url.replace("/v1/", "/v1/async/submit/") + kwargs["docparse_url"] = async_url return partition_file(*args, **kwargs) From 3e2c9702419ad6c5f4fad0cd7e38736a028a19df Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 17:19:55 -0800 Subject: [PATCH 19/58] Fix handling of positional and keyword arguments in `partition_file_submit_async` --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 41 +++++++++++--------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 153d0e23e..3847cf7f5 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -311,26 +311,31 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) if len(args) > docparse_url_position: if "/v1/async/submit" not in args[docparse_url_position]: args = list(args) + assert type(args[docparse_url_position]) == str args[docparse_url_position] = args[docparse_url_position].replace("/v1/", "/v1/async/submit/") else: - # Check if aps_url was provided as a positional argument. If it was, then this checks to make sure that - # aps_url is set to the async endpoint. If aps_url is specified and it's not set to the async endpoint, - # then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. - if len(args) > aps_url_position: # Checks if the aps_url is specified as a positional argument - if "/v1/async/submit" not in args[aps_url_position]: # Detect if the aps_url is set to the async endpoint - args = list(args) - args[aps_url_position] = args[aps_url_position].replace("/v1/", "/v1/async/submit/") - else: # Neither docparse_url nor aps_url were provided as a positional argument - if "aps_url" in kwargs: - aps_url = kwargs["aps_url"] - assert type(aps_url) == str - if "/v1/async/submit" not in aps_url: - kwargs["aps_url"] = aps_url.replace("/v1/", "/v1/async/submit/") - else: - async_url = kwargs.get("docparse_url", ARYN_DOCPARSE_URL) - if "/v1/async/submit" not in async_url: - async_url = async_url.replace("/v1/", "/v1/async/submit/") - kwargs["docparse_url"] = async_url + # Since docparse_url take precedence over aps_url, check if docparse_url was provided as a keyword argument + if "docparse_url" in kwargs: + docparse_url = kwargs["docparse_url"] + assert type(docparse_url) == str + if "/v1/async/submit" not in docparse_url: + kwargs["docparse_url"] = docparse_url.replace("/v1/", "/v1/async/submit/") + else: + # Check if aps_url was provided as a positional argument. If it was, then this checks to make sure that + # aps_url is set to the async endpoint. If aps_url is specified and it's not set to the async endpoint, + # then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. + if len(args) > aps_url_position: # Checks if the aps_url is specified as a positional argument + if "/v1/async/submit" not in args[aps_url_position]: # Detect if the aps_url is set to async + args = list(args) + args[aps_url_position] = args[aps_url_position].replace("/v1/", "/v1/async/submit/") + else: # docparse was not provided as an argument at all and aps_url was not provided positionally + if "aps_url" in kwargs: + aps_url = kwargs["aps_url"] + assert type(aps_url) == str + if "/v1/async/submit" not in aps_url: + kwargs["aps_url"] = aps_url.replace("/v1/", "/v1/async/submit/") + else: + kwargs["docparse_url"] = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") return partition_file(*args, **kwargs) From c68cda60daecf7dceb529a70e89a7d05f1954bb1 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 17:22:10 -0800 Subject: [PATCH 20/58] Fix linting --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 3847cf7f5..d69340f29 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -302,36 +302,38 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) ordered_partition_file_parameter_names = partition_file_full_arg_spec[0] docparse_url_position = ordered_partition_file_parameter_names.index("docparse_url") aps_url_position = ordered_partition_file_parameter_names.index("aps_url") - assert aps_url_position < docparse_url_position, "partition_file_submit_async assumes that aps_url comes before docparse_url" + assert ( + aps_url_position < docparse_url_position + ), "partition_file_submit_async assumes that aps_url comes before docparse_url" - if not force_async_url: # If force_async_url is set to True, then this function will not change the endpoint + if not force_async_url: # If force_async_url is set to True, then this function will not change the endpoint # Check if docparse_url was provided as a positional argument. If it was, then this checks to make sure that # docparse_url is set to the async endpoint. If docparse_url is specified and it's not set to the async # endpoint, then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. if len(args) > docparse_url_position: if "/v1/async/submit" not in args[docparse_url_position]: args = list(args) - assert type(args[docparse_url_position]) == str + assert isinstance(args[docparse_url_position], str) args[docparse_url_position] = args[docparse_url_position].replace("/v1/", "/v1/async/submit/") else: # Since docparse_url take precedence over aps_url, check if docparse_url was provided as a keyword argument if "docparse_url" in kwargs: docparse_url = kwargs["docparse_url"] - assert type(docparse_url) == str + assert isinstance(docparse_url, str) if "/v1/async/submit" not in docparse_url: kwargs["docparse_url"] = docparse_url.replace("/v1/", "/v1/async/submit/") else: # Check if aps_url was provided as a positional argument. If it was, then this checks to make sure that # aps_url is set to the async endpoint. If aps_url is specified and it's not set to the async endpoint, # then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. - if len(args) > aps_url_position: # Checks if the aps_url is specified as a positional argument - if "/v1/async/submit" not in args[aps_url_position]: # Detect if the aps_url is set to async + if len(args) > aps_url_position: # Checks if the aps_url is specified as a positional argument + if "/v1/async/submit" not in args[aps_url_position]: # Detect if the aps_url is set to async args = list(args) args[aps_url_position] = args[aps_url_position].replace("/v1/", "/v1/async/submit/") - else: # docparse was not provided as an argument at all and aps_url was not provided positionally + else: # docparse was not provided as an argument at all and aps_url was not provided positionally if "aps_url" in kwargs: aps_url = kwargs["aps_url"] - assert type(aps_url) == str + assert isinstance(aps_url, str) if "/v1/async/submit" not in aps_url: kwargs["aps_url"] = aps_url.replace("/v1/", "/v1/async/submit/") else: From 3d2eac372ad6ba90767d3246dc9bdb1bd35359fc Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 17:23:50 -0800 Subject: [PATCH 21/58] Move async tests together --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index d8d57d234..9ca24e1fa 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -148,11 +148,6 @@ def test_data_to_pandas(): assert df["2018"][13] == "134" -def test_invalid_job_id(): - with pytest.raises(NoSuchAsyncPartitionerJobError): - partition_file_result_async("INVALID_JOB_ID") - - def test_convert_img(): with open(RESOURCE_DIR / "image" / "partitioning_output.json", "r") as f: data = json.load(f) @@ -169,6 +164,11 @@ def test_convert_img(): assert png_str == real_str +def test_invalid_job_id(): + with pytest.raises(NoSuchAsyncPartitionerJobError): + partition_file_result_async("INVALID_JOB_ID") + + def test_partition_file_async(): with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: job_id = partition_file_submit_async(f)["job_id"] From e5d2f88e62583b88112a7fc30b38345375d50a9d Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 18:02:35 -0800 Subject: [PATCH 22/58] Add url forwarding validation --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 73 +++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 9ca24e1fa..bbc5e3ae6 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -1,8 +1,11 @@ -from aryn_sdk.partition.partition import convert_image_element, tables_to_pandas +from os import PathLike +from typing import Any, BinaryIO, Literal, Optional, Union +from aryn_sdk.partition.partition import convert_image_element, tables_to_pandas, ARYN_DOCPARSE_URL import pytest import json import time from pathlib import Path +import inspect from aryn_sdk.partition import ( partition_file, @@ -11,6 +14,7 @@ NoSuchAsyncPartitionerJobError, PartitionError, ) +from aryn_sdk.config import ArynConfig from requests.exceptions import HTTPError RESOURCE_DIR = Path(__file__).parent / "resources" @@ -183,3 +187,70 @@ def test_partition_file_async(): expected_result = json.load(f) assert expected_result["elements"] == actual_result["elements"] + + +def test_partiton_file_async_url_forwarding(mocker): + def call_partition_file(base_url: str): + partition_file_submit_async("", docparse_url=base_url) + partition_file_submit_async("", aps_url=base_url) + partition_file_submit_async(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, base_url) + partition_file_submit_async(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wrong", base_url) + partition_file_submit_async(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wrong", docparse_url=base_url) + partition_file_submit_async("", aps_url=base_url, docparse_url=base_url) + + standard_async_url = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") + + def check_standard_url( + file: Union[BinaryIO, str, PathLike], + aryn_api_key: Optional[str] = None, + aryn_config: Optional[ArynConfig] = None, + threshold: Optional[Union[float, Literal["auto"]]] = None, + use_ocr: bool = False, + ocr_images: bool = False, + extract_table_structure: bool = False, + table_extraction_options: dict[str, Any] = {}, + extract_images: bool = False, + selected_pages: Optional[list[Union[list[int], int]]] = None, + chunking_options: Optional[dict[str, Any]] = None, + aps_url: Optional[str] = None, # deprecated in favor of docparse_url + docparse_url: Optional[str] = None, + ssl_verify: bool = True, + output_format: Optional[str] = None, + output_label_options: dict[str, Any] = {}, + ): + url = docparse_url or aps_url + assert url == standard_async_url + + mocker.patch("inspect.getfullargspec").return_value = inspect.getfullargspec(partition_file) + mocker.patch("aryn_sdk.partition.partition.partition_file", side_effect=check_standard_url) + partition_file_submit_async("") + call_partition_file(ARYN_DOCPARSE_URL) + call_partition_file(standard_async_url) + + nonstandard_url_example = "http://localhost:8000/v1/document/partition" + nonstandard_async_url_example = nonstandard_url_example.replace("/v1/", "/v1/async/submit/") + + def check_nonstandard_url( + file: Union[BinaryIO, str, PathLike], + aryn_api_key: Optional[str] = None, + aryn_config: Optional[ArynConfig] = None, + threshold: Optional[Union[float, Literal["auto"]]] = None, + use_ocr: bool = False, + ocr_images: bool = False, + extract_table_structure: bool = False, + table_extraction_options: dict[str, Any] = {}, + extract_images: bool = False, + selected_pages: Optional[list[Union[list[int], int]]] = None, + chunking_options: Optional[dict[str, Any]] = None, + aps_url: Optional[str] = None, # deprecated in favor of docparse_url + docparse_url: Optional[str] = None, + ssl_verify: bool = True, + output_format: Optional[str] = None, + output_label_options: dict[str, Any] = {}, + ): + url = docparse_url or aps_url + assert url == nonstandard_async_url_example + + mocker.patch("aryn_sdk.partition.partition.partition_file", side_effect=check_nonstandard_url) + call_partition_file(nonstandard_url_example) + call_partition_file(nonstandard_async_url_example) From d4b072c045eb6c898ff37ce6632d5e5b5b44fc3e Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 18:12:26 -0800 Subject: [PATCH 23/58] Add `test_partition_file_submit_async` unit test --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index bbc5e3ae6..503e6f49e 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -173,6 +173,22 @@ def test_invalid_job_id(): partition_file_result_async("INVALID_JOB_ID") +def test_partition_file_submit_async(mocker): + data = b'{"job_id": "1234"}' + expected_response = json.loads(data.decode("utf-8")) + + mocked_response = mocker.Mock() + mocked_response.status_code = 202 + mocked_response.iter_content.return_value = data.split(sep=b"\n") + + mocker.patch("requests.post").return_value = mocked_response + + with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: + response = partition_file_submit_async(f) + + assert response == expected_response + + def test_partition_file_async(): with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: job_id = partition_file_submit_async(f)["job_id"] From e55687e4dd5e8f6a7a848acde1b2b8524a0539ab Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 18:17:59 -0800 Subject: [PATCH 24/58] Fix mypy issues --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index d69340f29..f1d30fc59 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -306,15 +306,16 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) aps_url_position < docparse_url_position ), "partition_file_submit_async assumes that aps_url comes before docparse_url" + args_list = list(args) + if not force_async_url: # If force_async_url is set to True, then this function will not change the endpoint # Check if docparse_url was provided as a positional argument. If it was, then this checks to make sure that # docparse_url is set to the async endpoint. If docparse_url is specified and it's not set to the async # endpoint, then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. - if len(args) > docparse_url_position: + if len(args_list) > docparse_url_position: if "/v1/async/submit" not in args[docparse_url_position]: - args = list(args) - assert isinstance(args[docparse_url_position], str) - args[docparse_url_position] = args[docparse_url_position].replace("/v1/", "/v1/async/submit/") + assert isinstance(args_list[docparse_url_position], str) + args_list[docparse_url_position] = args_list[docparse_url_position].replace("/v1/", "/v1/async/submit/") else: # Since docparse_url take precedence over aps_url, check if docparse_url was provided as a keyword argument if "docparse_url" in kwargs: @@ -326,10 +327,9 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) # Check if aps_url was provided as a positional argument. If it was, then this checks to make sure that # aps_url is set to the async endpoint. If aps_url is specified and it's not set to the async endpoint, # then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. - if len(args) > aps_url_position: # Checks if the aps_url is specified as a positional argument + if len(args_list) > aps_url_position: # Checks if the aps_url is specified as a positional argument if "/v1/async/submit" not in args[aps_url_position]: # Detect if the aps_url is set to async - args = list(args) - args[aps_url_position] = args[aps_url_position].replace("/v1/", "/v1/async/submit/") + args_list[aps_url_position] = args_list[aps_url_position].replace("/v1/", "/v1/async/submit/") else: # docparse was not provided as an argument at all and aps_url was not provided positionally if "aps_url" in kwargs: aps_url = kwargs["aps_url"] @@ -338,7 +338,7 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) kwargs["aps_url"] = aps_url.replace("/v1/", "/v1/async/submit/") else: kwargs["docparse_url"] = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") - return partition_file(*args, **kwargs) + return partition_file(*args_list, **kwargs) def partition_file_result_async( From a82b90cc64ce36e6173cf646992fe17d12bbb95b Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 18:34:47 -0800 Subject: [PATCH 25/58] Fix relevant docstrings. Add a multi-job example --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 39 ++++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index f1d30fc59..56c2e23b4 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -283,19 +283,49 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) A dictionary containing "job_id" which can be used with the `partition_file_result_async` function to get the results. - Example: + Single Job Example: .. code-block:: python - from aryn_sdk.partition import partition_file_submit_async + import time + from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async with open("my-favorite-pdf.pdf", "rb") as f: job = partition_file_submit_async( f, - ary_api_key="MY-ARYN-API-KEY", use_ocr=True, extract_table_structure=True, ) + job_id = job["job_id"] + + # Poll for the results + result = partition_file_result_async(job_id) + while not result: + time.sleep(5) + result = partition_file_result_async(job_id) + + Multi-Job Example: + .. code-block:: python + + import logging + import time + from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async + + files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] + job_ids = {} + for i, f in enumerate(files): + try: + job_ids[i] = partition_file_submit_async(f)) + except Exception as e: + logging.warning(f"Failed to submit {f}: {e}") + + results = {} + for i, job_id in job_ids.items(): + result = partition_file_result_async(job_id) + while not result: + time.sleep(5) + result = partition_file_result_async(job_id) + results[i] = result """ partition_file_full_arg_spec = inspect.getfullargspec(partition_file) @@ -361,7 +391,8 @@ def partition_file_result_async( Raises a NoSuchAsyncPartitionerJobError if the job_id is not found. - If this job is still in progress, the response will be a 202 status code with a "status" field of "processing". + Example: + See the examples in `partition_file_submit_async` for a full example of how to use this function. """ if aryn_api_key is not None: if aryn_config is not None: From c38418dc065f012a77fe82c43338a58a04c560b8 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 18:38:49 -0800 Subject: [PATCH 26/58] Add async examples to readme --- lib/aryn-sdk/README.md | 47 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index 426884dd3..2a8d7788d 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -96,3 +96,50 @@ pil_img = convert_image_element(image_elts[0]) jpg_bytes = convert_image_element(image_elts[1], format='JPEG') png_str = convert_image_element(image_elts[2], format="PNG", b64encode=True) ``` + +### Async Aryn DocParse + +#### Single Job Example +```python +import time +from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async + +with open("my-favorite-pdf.pdf", "rb") as f: + job = partition_file_submit_async( + f, + use_ocr=True, + extract_table_structure=True, + ) + +job_id = job["job_id"] + +# Poll for the results +result = partition_file_result_async(job_id) +while not result: + time.sleep(5) + result = partition_file_result_async(job_id) +``` + +#### Multi-Job Example + +```python +import logging +import time +from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async + +files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] +job_ids = {} +for i, f in enumerate(files): + try: + job_ids[i] = partition_file_submit_async(f)) + except Exception as e: + logging.warning(f"Failed to submit {f}: {e}") + +results = {} +for i, job_id in job_ids.items(): + result = partition_file_result_async(job_id) + while not result: + time.sleep(5) + result = partition_file_result_async(job_id) + results[i] = result +``` \ No newline at end of file From d081f9ca779d1130c61fe3ecde46300df9aad664 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 17 Jan 2025 18:45:59 -0800 Subject: [PATCH 27/58] Narrow excepted Exceptions in multi-document async examples --- lib/aryn-sdk/README.md | 13 ++++++++----- lib/aryn-sdk/aryn_sdk/partition/partition.py | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index 2a8d7788d..5f93a19ae 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -125,7 +125,7 @@ while not result: ```python import logging import time -from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async +from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, PartitionError files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} @@ -137,9 +137,12 @@ for i, f in enumerate(files): results = {} for i, job_id in job_ids.items(): - result = partition_file_result_async(job_id) - while not result: - time.sleep(5) + try: result = partition_file_result_async(job_id) - results[i] = result + while not result: + time.sleep(5) + result = partition_file_result_async(job_id) + results[i] = result + except PartitionError as e: + logging.warning(f"Partitioning failed for document {i}") ``` \ No newline at end of file diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 56c2e23b4..3c6e8a2e0 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -309,7 +309,7 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) import logging import time - from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async + from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, PartitionError files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} @@ -321,11 +321,14 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) results = {} for i, job_id in job_ids.items(): - result = partition_file_result_async(job_id) - while not result: - time.sleep(5) + try: result = partition_file_result_async(job_id) - results[i] = result + while not result: + time.sleep(5) + result = partition_file_result_async(job_id) + results[i] = result + except PartitionError as e: + logging.warning(f"Partitioning failed for document {i}") """ partition_file_full_arg_spec = inspect.getfullargspec(partition_file) From cd94238fed821449b68655ba0ee9320597f2db6a Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Wed, 22 Jan 2025 11:30:59 -0800 Subject: [PATCH 28/58] Add synchronous test checking unsupported file format behavior --- ...nsupported-format-test-document-image.heic | Bin 0 -> 7247 bytes lib/aryn-sdk/aryn_sdk/test/test_partition.py | 38 ++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) create mode 100644 lib/aryn-sdk/aryn_sdk/test/resources/image/unsupported-format-test-document-image.heic diff --git a/lib/aryn-sdk/aryn_sdk/test/resources/image/unsupported-format-test-document-image.heic b/lib/aryn-sdk/aryn_sdk/test/resources/image/unsupported-format-test-document-image.heic new file mode 100644 index 0000000000000000000000000000000000000000..2d120dc623d43adc850191ad9fd035e384961037 GIT binary patch literal 7247 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 literal 0 HcmV?d00001 diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 503e6f49e..908c9594f 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -124,6 +124,12 @@ def test_partition_it(pdf, kwargs, response): assert response_data["elements"] == new_response["elements"] +def test_partition_with_unsupported_file_format(): + with pytest.raises(PartitionError): + with open(RESOURCE_DIR / "image" / "unsupported-format-test-document-image.heic", "rb") as f: + partition_file(f) + + def test_partition_it_zero_page(): with pytest.raises(PartitionError) as einfo: @@ -189,22 +195,6 @@ def test_partition_file_submit_async(mocker): assert response == expected_response -def test_partition_file_async(): - with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: - job_id = partition_file_submit_async(f)["job_id"] - - start = time.time() - actual_result = None - while not actual_result and time.time() - start < 60 * 5: - actual_result = partition_file_result_async(job_id) - time.sleep(5) - - with open(RESOURCE_DIR / "json" / "3m_output.json", "rb") as f: - expected_result = json.load(f) - - assert expected_result["elements"] == actual_result["elements"] - - def test_partiton_file_async_url_forwarding(mocker): def call_partition_file(base_url: str): partition_file_submit_async("", docparse_url=base_url) @@ -270,3 +260,19 @@ def check_nonstandard_url( mocker.patch("aryn_sdk.partition.partition.partition_file", side_effect=check_nonstandard_url) call_partition_file(nonstandard_url_example) call_partition_file(nonstandard_async_url_example) + + +def test_partition_file_async(): + with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: + job_id = partition_file_submit_async(f)["job_id"] + + start = time.time() + actual_result = None + while not actual_result and time.time() - start < 60 * 5: + actual_result = partition_file_result_async(job_id) + time.sleep(5) + + with open(RESOURCE_DIR / "json" / "3m_output.json", "rb") as f: + expected_result = json.load(f) + + assert expected_result["elements"] == actual_result["elements"] From ab6aa3f5a13f9fbf0d078c732d1a40dc1cc39479 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Wed, 22 Jan 2025 13:50:45 -0800 Subject: [PATCH 29/58] Make `partition_file_submit_async` response more intuitive --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 6 +- lib/aryn-sdk/aryn_sdk/partition/partition.py | 63 ++++++++++---------- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 28 +++++++-- 3 files changed, 56 insertions(+), 41 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index 23c6aed23..deb75e7ff 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -6,8 +6,7 @@ table_elem_to_dataframe, convert_image_element, PartitionError, - NoSuchAsyncPartitionerJobError, - AsyncPartitionerError, + JobStatus, ) from .art import draw_with_boxes @@ -20,6 +19,5 @@ "PartitionError", "partition_file_submit_async", "partition_file_result_async", - "NoSuchAsyncPartitionerJobError", - "AsyncPartitionerError", + "JobStatus", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 3c6e8a2e0..5b66b3851 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -1,7 +1,9 @@ from os import PathLike from typing import BinaryIO, Literal, Optional, Union, Any +from enum import Enum from collections.abc import Mapping from aryn_sdk.config import ArynConfig +from pydantic import BaseModel import requests import sys import json @@ -28,16 +30,6 @@ def __init__(self, message: str, status_code: int) -> None: self.status_code = status_code -class AsyncPartitionerError(Exception): - def __init__(self, message: str, status_code: int) -> None: - super().__init__(message) - self.status_code = status_code - - -class NoSuchAsyncPartitionerJobError(Exception): - pass - - def partition_file( file: Union[BinaryIO, str, PathLike], aryn_api_key: Optional[str] = None, @@ -300,7 +292,7 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) # Poll for the results result = partition_file_result_async(job_id) - while not result: + while result.status == JobStatus.IN_PROGRESS: time.sleep(5) result = partition_file_result_async(job_id) @@ -321,14 +313,11 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) results = {} for i, job_id in job_ids.items(): - try: + result = partition_file_result_async(job_id) + while result.status == JobStatus.IN_PROGRESS: + time.sleep(5) result = partition_file_result_async(job_id) - while not result: - time.sleep(5) - result = partition_file_result_async(job_id) - results[i] = result - except PartitionError as e: - logging.warning(f"Partitioning failed for document {i}") + results[i] = result """ partition_file_full_arg_spec = inspect.getfullargspec(partition_file) @@ -374,28 +363,40 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) return partition_file(*args_list, **kwargs) +class JobStatus(str, Enum): + IN_PROGRESS = "in_progress" + DONE = "done" + ERROR = "error" + NO_SUCH_JOB = "no_such_job" + + +class JobResult(BaseModel): + status: JobStatus + status_code: int + result: Optional[dict] + + def partition_file_result_async( job_id: str, aryn_async_url: str = f"{ARYN_DOCPARSE_URL.split('/v1/',1)[0]}/v1/async/result", aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, ssl_verify: bool = True, -) -> Optional[dict]: +) -> JobResult: """ Get the results of an asynchronous partitioning job by job_id. Meant to be used with `partition_file_submit_async`. Returns: - If the specified job is done and the call is successful, then this function returns the same output as a call - to `partition_file`. That would be a dictionary containing "status", "elements", and possibly "error". However, - if the `output_format` option of the original request was "markdown" then it returns a dictionary of "status", - "markdown", and possibly "error". - - Returns None if the job is still in progress. + A JobResult object containing "status", "status_code", and also "result" which is non-None when "status" is + JobStatus.DONE. - Raises a NoSuchAsyncPartitionerJobError if the job_id is not found. + Unlike `partition_file`, this function does not raise an Exception if the partitioning failed. Note the + "result" attribute of the returned JobResult contains what would have been the return value of `partition_file` + had the partitioning been done synchronously. Example: - See the examples in `partition_file_submit_async` for a full example of how to use this function. + See the examples in the docstring for `partition_file_submit_async` for a full example of how to use this + function. """ if aryn_api_key is not None: if aryn_config is not None: @@ -419,13 +420,13 @@ def partition_file_result_async( response = requests.get(specific_job_url, headers=http_header, stream=stream, verify=ssl_verify) if response.status_code == 200: - return response.json() + return JobResult(status=JobStatus.DONE, result=response.json(), status_code=response.status_code) elif response.status_code == 202: - return None + return JobResult(status=JobStatus.IN_PROGRESS, status_code=response.status_code, result=None) elif response.status_code == 404: - raise NoSuchAsyncPartitionerJobError() + return JobResult(status=JobStatus.NO_SUCH_JOB, status_code=response.status_code, result=None) else: - raise AsyncPartitionerError(f"Failed to get results of async partition job {job_id}", response.status_code) + return JobResult(status=JobStatus.ERROR, status_code=response.status_code, result=None) # Heavily adapted from lib/sycamore/data/table.py::Table.to_csv() diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 908c9594f..cb7f20121 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -11,8 +11,8 @@ partition_file, partition_file_submit_async, partition_file_result_async, - NoSuchAsyncPartitionerJobError, PartitionError, + JobStatus, ) from aryn_sdk.config import ArynConfig from requests.exceptions import HTTPError @@ -175,8 +175,8 @@ def test_convert_img(): def test_invalid_job_id(): - with pytest.raises(NoSuchAsyncPartitionerJobError): - partition_file_result_async("INVALID_JOB_ID") + response = partition_file_result_async("INVALID_JOB_ID") + assert response.status == JobStatus.NO_SUCH_JOB def test_partition_file_submit_async(mocker): @@ -267,12 +267,28 @@ def test_partition_file_async(): job_id = partition_file_submit_async(f)["job_id"] start = time.time() - actual_result = None - while not actual_result and time.time() - start < 60 * 5: + actual_result = partition_file_result_async(job_id) + while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < 60 * 5: actual_result = partition_file_result_async(job_id) time.sleep(5) + assert actual_result.status == JobStatus.DONE with open(RESOURCE_DIR / "json" / "3m_output.json", "rb") as f: expected_result = json.load(f) - assert expected_result["elements"] == actual_result["elements"] + assert expected_result["elements"] == actual_result.result["elements"] + + +def test_async_partition_with_unsupported_file_format(): + with open(RESOURCE_DIR / "image" / "unsupported-format-test-document-image.heic", "rb") as f: + job_id = partition_file_submit_async(f)["job_id"] + + start = time.time() + actual_result = partition_file_result_async(job_id) + while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < 60 * 5: + actual_result = partition_file_result_async(job_id) + time.sleep(5) + assert actual_result.status == JobStatus.DONE + assert actual_result.result is not None + assert actual_result.result["status_code"] == 500 + assert actual_result.result["error"] == "500: Failed to convert file to pdf" From 49a393bb6e81e53d9206cd16129ea651c1e535bf Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Wed, 22 Jan 2025 15:36:51 -0800 Subject: [PATCH 30/58] Fix examples in README --- lib/aryn-sdk/README.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index 5f93a19ae..28c264964 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -115,7 +115,7 @@ job_id = job["job_id"] # Poll for the results result = partition_file_result_async(job_id) -while not result: +while result.status == JobStatus.IN_PROGRESS: time.sleep(5) result = partition_file_result_async(job_id) ``` @@ -137,12 +137,9 @@ for i, f in enumerate(files): results = {} for i, job_id in job_ids.items(): - try: + result = partition_file_result_async(job_id) + while result.status == JobStatus.IN_PROGRESS: + time.sleep(5) result = partition_file_result_async(job_id) - while not result: - time.sleep(5) - result = partition_file_result_async(job_id) - results[i] = result - except PartitionError as e: - logging.warning(f"Partitioning failed for document {i}") + results[i] = result ``` \ No newline at end of file From ddf6b74f908acc2baec0b45d13274d630e087957 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 11:49:40 -0800 Subject: [PATCH 31/58] Add test that checks multiple simultaneous async requests --- .../pdfs/FR-2002-05-03-TRUNCATED-40.pdf | Bin 0 -> 433204 bytes lib/aryn-sdk/aryn_sdk/test/test_partition.py | 30 ++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 lib/aryn-sdk/aryn_sdk/test/resources/pdfs/FR-2002-05-03-TRUNCATED-40.pdf diff --git a/lib/aryn-sdk/aryn_sdk/test/resources/pdfs/FR-2002-05-03-TRUNCATED-40.pdf b/lib/aryn-sdk/aryn_sdk/test/resources/pdfs/FR-2002-05-03-TRUNCATED-40.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e27a8df65c830e673452698e0a0a601d154da65b GIT binary patch literal 433204 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 n=SwZ!Rp^Tw!+n09$ zJ~JJ56^4pvVT35!rF6RfDL3V&lS4pMk)hP*iv;=^og&A-#vQy~{>me0`NMDYtbwy^ z^h~Jpl5v6E%>_Z8LycT@G|^KMRv=Z~Iv1R6H?fgvPh`oecyzc0MeZmjZI?RN3RXSL z*hvXj5Cj&SHHs0__OAQ7%3=Kki`6_aA=>$6DjlX5K?~E*two5w&8BOf4EmkA!yol- zo|D!N-VFc(uX9F+{3ndc$DgyPqDItnTAy_mPdUdrqM!)}dsG@%m%U6s$n;pw+x>TPL!4XK zo*dHs?MASznvR)*d)oR>;E>^Azyh|k7$yCC8#(U}ejx^H?}oBKxy-8J67rCJtj^`T zr6r)Vogh8S6Ebzsf4h+Qono3Ci;F4dp}8*+@=bmT&+FM;Cdr${8*je+(vZgZkAdiaYK2H& zQ}Srd4mropl z4MfG8-E^MV;8bR;hE78Bgh|r6`sWAo;G9td#HSn*}ke30WnX3q{8#D-(yJU4cm80V~P~jU*=o4J|5e52DY)|+0!88 z-KWgC5uJ)hBN9S6Hrprw!qhUDBILE+=cVh ze4OQq-fscdD;jfe*KZ&mLCI>Q>n;J(MxwLrYBZtTYb1!ayipDe=%2~MxOD-TKeni^ zzjvW@+YJwIOIlZ9weQ7;ZGfFqk6Sdax>2BsoDHUPYK`aCRNc1k16Jbxd+jKr#i zCCH>d@3)}|+SD5?j$%IgI#w@Lf}H#bi>BlEG!F7RmDsNA>gQyW!i#0n#1qu+Qo;yMR$bdx z+ud;QwRkD8P6hC_N`Ut8XqxR}h0svlj@CR(=$bRJnT;#K2+HgE2VKf6qejo`XP9fGR0_lSULTv&FrqW)o^Ns{u4QPjyAY*;cCgBC?*_HF@pGzNOGFxgP zpY?logrfyP)%^QzEA|Miu#Pk&p;&xTTjC6v<+(kLcnCHrI{dkF-+iF}6j%U(+CT$A zOH@mU%9@z%eyAi;kfukGoQz0GxX8>3cBBnzM)s2sw%kWV{}#IP0&sp%@Gxlwe=$yo zS@a>4cQO>OBd|%vp5J%s{y(Wi^HBdc5@Gp&ArV#%4(9)jL?rDElt$^xX14`1ucaGQ(X zE>A|G-18J<_k8IZZ1Zt6$+Mkiz+kk2b58$+D~I4j;&kuO40>Lp@_51{c#MvvL!Oep zqe}s&D2yeWlizWE;zWC_4+Sy}O9#`?!RM^8xtL!+_8=s9&5_P^nfF3djO zbBS8UQM)z(MYkirCvgxjBKs;Ev?CtWK8?5?d{zMHDKA)J?0YR=E{mXgW8or&_^Sf?9$9Hx9Vu1J?WbCBkO`bI^M7z5ja6gl10*N=Nr9q6fli`P~Fi`o_L- z(7Nhdk>Gymdnh9P^Zm60>OH*uj9SFFLQ|r@3EhiT4Q!m0)7C>0o5B&b^d6?_^IkVi zx5>tIqsHAIZgU*EFiBF0wmJr^8f%D_)1;V%qQ*YVvE9EQc+R zLec0jgj1M}Bw#kgA=h^hDn*Jln>~2FeiTC`bK-OcjFX0f47ShUftXFos5>AxpQnC? zs8U5KiPT<}qbQ`UoB)Rw zy#&MOrr6PU#T}|!-A+o8magO?PF?d~7q*(+Mq%yd*LHH;F8@H9EihzAXzP<|q_G-~ z?!pVt%+UdXz-7VH54`YGg6~ZgmYP#sog_+SyU2F_YcfycYWG&^OV4sC!*>K!C`D|D zdUYP93n!3Z;H+Off`#s$II>v9Efad;6Ve3>B_8(6f*QLj95#Rbyg_bWDSQca95YWt z-wg8ITg;l5Da8JtCpHLTv}dBzR9~xk;T>xgeR|q%%Na(0Jk!|7=5d5LyqYvR6<6#v zSMszQTcy^nyZ7BMs7R2nS5rpB;~;7_=46~@!dy=0a>4|CgjMcdlyimn{GQSv zl}8D7WMHt|x3MdO&lGL@?>e<236ihsK>0qByQi-QPYUXOHsdpCSqlB+oSPpsBbxU6 zjRK_m&MsH0;d)NHthbX`eYDtT{dDGcx2@%E-XKNj(ra?_KpbPXpZh^a%6cgAyr%N4dDpjH`Iy`FW@1*^CX-+xGjek@;}|qm zYYw{7fk2E1GsvQ4lslP;M(M`chCN_SV-^d*X0Ic(7`yA_S*S-gkdjOo7C0EEmX{$p z-(jAAUK_$Llp>EmnGjC@1RMGLX*fWoWiRkAN$o^d<6#gJ@!}|^x)-4&j+q>hU_{zX zPF$T@b17W>>22+BK;}Wa!X2`7aAzg0S)59vh;Ax*mSIm)+TR%u@QzCcLMP zjknJO0r3p|IAsr1_Lmu^+ zh05kgXCkvzMB#=}tgLl`48ExtD)M{F3L~A*BLvp*LiBPE5mFOb81M0dGP31intuQL zzMPUHtFke!rR(h2yws&hUPJCyXRuLepSl5}I1j50>(4(lo_DO8dc7#yOWPgC*;<<7 zV`f&GGFB!Iwv71du5RtK;(e%yZ7qwJ<{U_WAq`+S(MJgH-2jCb+3x?3&V1avhXv%2 zb7(w)N07so4gPTv3}j>!0=uh3@pm+el_%!hcgflpaf)Mh;I+8Qc|vXDV9ueq&^fFb z{|P6qKr5`V!!3gSseIy_m`9|k7MM*wuD`;G1ge#%85Ss_{yp|VXhgo8&G%P?zr}^< z&33*C&A6c}p8H$^zBGd!C9!j=OAuRxxFdv;1wV zZrPXc)-Fe1*=<(J>QQP6W?|3<-TcN?iLZM)`&)?`?Y@pDgHiC3-(}g2CP%o@0^O&S z{jrM^rp@LiY5; zJ#hUnoHvE9QK0~vm_&=09B-PK6d=16PfOr+IF{{lMY z)dx$(PR)m`blZe+%_30ViZ@VI{+Y8O^kUGUYW?%zV>d=%xpf=iaJh99g6Vw-^mdTb zTF0Z4!)^sf2}T!QtG@RJj7A;N02ORE@GDqyB--u9YFjUgEK4I<@N}XOEAuquPwIs9 zt;k#6##qEH{H~XFFNhyx5lUZ+Hl0x)7bfL`FHRfz@$9eX+br{!#w%Fa6Cdx_7X%AT z*>fe$8wr@@=BM3ZYQ-#aS40e?!C{PMQ*PkS6l#ELCy?jjNa0VbN~&)~~$HG$GvBaU{CAGN*6;o>j2J)N21PGjginwUkl^z&M`cO6gU*)pe~}NFZI{C? z?Af52dOQjp^Wm$zc6R5c{*0VG^%y{|^9$tvWPV`8pvxIMxR<1xIgQ{=*tZ0xkT0`WPZ0(nDHE?m0lx7^!lJX38=H zGWQo3vIF@iZVh&Z9dfnohLkVZn-60yEXQdzO_=qTubs@Y2+0g=FfXV;{ppxPJbz0f z%BXj%uc=cdtQ5Mbv7C*K`}Y;4KeZTyN8tu&eM4fr`>3#(ZFk7EI!QUu@!X2{n%7nF z+%swqb;nx{oLllPT&|)}8n{XR2#=l4YU_LdYCRn%8xlXv9glVL)h5BcMg9v#gEG`J zt$-lz*kI@|S(45uE=LDrz6z0^Yo$IvYdeC+2_EQ~TvA)iH3Z@Pw`2jDSDOXvG|Pe_ zc+&-rWMQW5j;Ly7tkU>0F)U`-v5*RlMT!(_s#Cg$&UhG8_O_M>IuSp_Osb0W0D@OIz zPy~F;x!ol^{40uxnAjmm4L4`ciLn~LAWn^GDomGwE4ERFT+H7v>->r>QidjUFyplh zRJsA+r)OaRBq`(0oa_z8J}cn-y5z~4Uol-|bzAonYTJ&3WZIqm$t}*C<&dM}t;JTO zg<$Mg#)0CeT>%HB?q7t`)CukP1cZ)xUb1M&=Dxo3W~$oa;wPW=sUY3vwVy{p(3YXI zSC5}1FNqDw9g|HW1U_1?`WXt?;v@!3^b`7X$muTxawi_Ev4rqQ)tryy4jPZlguthT zQtXBYbt0+m$V2H3VJgqHugb-|A&;5gHE)0lH;E_NW4Syk-``C*(CAvS`CA_KtC{#RcVD<(PkvvkIRrsuLWTk6M$UC;=LUoizKU2#T!(lFjdy>wy_h?hEF#T> z7rtU(kS@*8tUCgQ=Q#8FB}Y!=GSGkTA{5!LfEsjyK&Z6}Wgkd4&=`L6z%N8juc>c% zV6V?@J`e5r!ci;TLw|GNopWM7&$A4Wg#p^lY8y)hv87x@;DP6H)&<73f0~)f8Ikwt z*S4qa-_XEB*gbk;l~r9QE5ASGTo)OKC+k37DG+~zSaaj_RnMWImfo|aJ8v+hnQAbV zi!Rut{HNOaFs8%A-Cbk^?0H_*vc_;F-uCR_-UH0=Grp_64d3|DX`*6h?7%)lVT27 z_d{Y+Ynr|&JuUF(7wdF3a`O(X(Smrv{s zeqO$UP#!D!2?dlK1VZDe`p-0!ABW^365%A@Yf>4!yS!f=MiI`+ha38xyH|n>jVy&m zpfUqhM0e8_5md&*8mzenv_sTFCYz^YXS)Rx;Esq4^!KNLemy?(pXFdFjR4>KUX2Z` z(`$dz;etxb0d_57H00)WLfzPSqfRl4vg`roiw)-&1JjW3C1-bVQHO09Ya=Qp^%)X&FUx zm^?pHDMSAGREip#85i*jKiN7L9Z#^k_36wYAe7J~@!qNi?Y=eBtQod$Mw4RQbv}4l zhnqW&&yrTgRo$RS+i+;LDJs@#WOz+|c6A$T>++T=Bzfh+EB8U- zj$AYUMuW^5DdyutGdzmi;g{a^;GtuE?oTiXdg+)`_2$wE)Qy@*(5{aeQ-S+Cp23-J3@;l|wacI#>)7+#?L{-<^K+D?lrg8pt(kVCGVn zUO~{KG6!G+jk5efj>UDJxo0CAy)s)?%G{Xo9&VE4Z%9KXFRuG>nO_VyWrnoDEc+nM z#*A2GX70|u&0;!#4P*P!Z@LyEB?_DDXegf>S#VnQGSxK``rq z4|cS|6?JM;Vx0{0QG*Dv=8`~BhvxRdQl?qCdjjNsn54UyJISs|m>aC&z}-SY*YLRT zsS9y?J}bpENTo1ygAFA?+@EjhE(pmL{*iC>(GfO0=W+kZsCpxOwthz_b zR%RDDnOs=ApXzd~NGY?eehQQ>Ho{CtTWpZMRJ!{Lsjws_F^NG>#I&T1B6nFis7CZl zheO~RO+x7@Pi$YMyiUs0n=dS%+Kn;gSa|6M)|TF-&85(&j{_ZjsLX~(y{Uw~64=l4 z4l7;Yu^5#`ZfiFy(`d(B&ktq(?+Us}+03%j7;dsz*)gJ5ZP=ZFaVVfpKKs(l7{=*Fc2`G&RTH|C3wp#r}d zoY?&fY$1&D_KPBia)~x6R1xPTVoay&vmd5RZ}YWF_`R`Rj*Fp?As_6if-{oX-w7QO z@_mp*1?Vryc!*?zTlX(Z8s{e%cIiTci}84K8GcPs(p`oXhXdK+1Na-Xo`0Z@jKYt| zuqiHkau{{n)?Lg?m-1->2qYcwUMHrQ8L#qfJv)IH>S~hGxaiZO;o7bF^^X{^>(ilX z+`OiYf-%Pg)w2Q!$GhEV;y=HGB7B7$^Mrky>6-b_G~c3kcQ|To7fWZ%jRYn#x0u~7 zxGzj(xxDF|nPijC%(DMdV+ZaAX5j=4&FDBp>3R&@Ix*dTZBEfKEh`D#4flAgIHAnC zue83FTyqmF$#zE8c1Y>Pvpw=0W?;%vj`#+sJJ}7Lko4Xlr2vaO0T#&Qy)r3@{`r8C zCj*_=<;jEG5ICvK=!{>scT)1a92b=0HtO8+OCJ1rOSDx#f@Zx{@yD7M&08#evJ{wI zfDS4CKn(eUShbM&&H(Mg6Dt5o(IrT)0S&K20 znS>omfGMl3?tiXDv0jo6HoKRGYrHGQL6j!$6x7-JS8102!igf zwmtxPZS)|(Z@j>oLIzIxi97H_1aB`#9X^|&%FLENZ|m=2msH$Qn4tkxoPl&tq{oZ( z>8~rnoB35?09B-pOziu-AlfK*IrkaRrZ=$F%KEpf%_xjJ!l}B*}KBlHg%u*;13^K3q?H$ zTpy_`JRos;5i9*fqWViTko@xEGqzpy(qgX_TEe_)=;pV`c36u!B6;_t5~@;SoHjL= z=ixv-ggznh+V5ch($)&v6KJ+_5&W9&oNsCfOYLuBL;c3O{*B^v3VG+zpEE1PhK)qpb_0X6Nk`WXVACQF3}>b30aUY-WQ z!fajf4S62(MCWup<+XAb3yOnG?kcHdSvn{2Ed0mWb|f}fAj=(QhO}QvCY26IvQ5}K z8@7@pRbX{eAR+FWbW5aO%i|8S^p`kz-@y?i%{-lF@{Zw?@7<`x>t8nBv1WBva$OW4%@q4fRG2$Lz{1l=WkR7J)C9Nd% zAxi_XN+gfG=pR6f8wjIZE~S*RVn-ts)wRMWh7bqwc4<<6NM;9j|Xy!}5UJ zKs3wCrWOKrWQo!=B()xEJ;bI)V~2==y;oWEq?BhqtLM_H~G!=ES;7C$jjnkt}i^A?vSGk=yW@0 zK&s@N3CZtlI3PR8;Qs+1=s&{xkfR52&espjC3RuJZHj6?l(4V@g_=^>ulV~Yakie| z?lS0Zub@l>0(0Wra!AJWuvi(L!U;dmrbavxCeR!@9pce(`FccABqcwkhEWshYM7LRckB{2dXjnWB^Lc_rIUV=v4q)6Uu+@w&TMrg&z#Qe8g}p%dQj4;lwqPH zrIONPjy>NqG5~kEM4Dn|7F9s$Q(80BYtp@|&rLOv&qi#a>?=%HGeCI_m!)bF=)T+u&z$S?5Ik5_xjAo98ZSp<4iR}%@h-sysaCa^c~Ynj^j#fIy&e1f1> z-^w?2{UlEq4RLgkl=RB!TV8~My<2@-;$9N{ON<^P>!g zhjhh}+<5%ZDllk93S}9xRf&T#S^->;hNOG4fBs1TNiq{nq-0rigUMv{VX}2E8N)^* zM6!9%^Ctb|PZ=6lQ@SOJz^5_@g?Az?t^1%-F@S79C-o+i@=>oi^JigdF{(f5sH(cc zn|>r`K}}3(Y|DA}q8TYTpQdLqE3w8ZZ#-iq(OUE-?dLtVN8weW z(UTTCm`QS}x!%uUXf!0`VdPcn zP^=X_MY$&N1md|tkLHDHdss47n-V{D^)z2S6wNLM^>BM5tszyE(Wj_l%WzlVoLnfZ z!TlN`vqfVu1Wz1ZYG+SYJgtLh9Thv%KrZ&V(eNZ}XjY6&CIC#f=H_OD3`Xx4MALhd zf$XPL5@MvzjM)oiMm|3!-Y#A(VPa!`JH6Jx(1}8JI4ImGt^m%ms;#w`hwcxg8tNQF ze$4jw8iD`p-d|OgRnqLgzormtSD%M9>O5OOXv1jmIVlcZy0kX7zqaM_g-KkkLa11d5um^q8B zT;5z5agODQr`%m?r(E@#81Zn$#l~_?a1EN6cRPkc(!hIzA5~L(J%$qBs~k%esfGh0bF9QSdTdZxB$&=WYa&V;rPcc?Nhk{P!_mhl`>s zb9R`TxH9F|%_Yt=&o6@><>mhpg2f$M8*1X%v*QhNvMDfQRnF5~7gfm(2Y8;i2uyeq z^mYd2G&~q+lCqv!Ohj(XLDMzI%=W6<^$wl{Olc6|MhkTrteK(!`g>P{dfO{21=;@* zE1zDWJSXWZ4tccGY@4&^?Api0YK(SpeIVBPWNr3*IMxf}2)0Q+Nr6|WIg$0tQ|F|5 zGw;d>=Fv7BKH`oRtL}OVaquH@W7`_ULp);zdd<3#Meb2caSZboYWwzjyz0tN zTW4s%*?5@a(93p1GWQV}NOl`HY#u}BFR_gok@@GDP3g40MbW>xxwpF~!&Jp93RW-J zREwO#KJVVv4&9*osjQ>Dr-q$I9Cg4S&5nj&H%PgY8XaQ)TBHCfH0$|cxdh{kJRi0F z4<`>da+TnetgJ;n6^t6q?r0c5kx68FVE*eP6RWlJ2zWLrJHpHY@A}(3DpfhCp3ls~IzX9^S9@mfC^V--u>5bja7}Df+U>S5SLHwKVV#80Lwm&6 zChWHwlr6MNf{3gRSH$GUx~cW!bg5H4@^Eapog1x>oBUKA^5Ws%_4tW%A%O~Ip!q&~Xh(h)dS2Lk@rvbs3 zf7?2ZVJV{>=X@J!nl7Ad6GHQK*c~;-hIgXC6{#;FQr{|ol)>PEwXikI2}AsAX{ziP zJ2ll+;Q%wm(GWd@rgNa0Kh^9p3T(&?TLab_*wZtl9zNPVi%({!((d=+9&adC%8p(V zha|puXIS#3VR2fJ;6h+MK>_N%08up-?b?3 z_|pG(X;iA2S7*mB+8LS5;wNy2m)69K)x;tnA+~RzQ?47C5m#J@YJqwduF*={gP4zm z$Q`T&@u`adU`e~@r$%&c=M6rpCKVCf2x{ItY}pm88O7s2k(S9ctX<+Q<>2KfT?8d% zzn`+P$3HMZiYnlBf$O4bp*4#G!wnoJd?-VVS5WKyjBE%#Vc0a76z`luo2||JtJfm$ znBXq9fbrHS^r@F02Gf1wYk)*UNt> zAD4HR{1RnK)VfEdfJT{R+dg%Db|XK;^cKJE(7`zWd>BTo;2t58xD64PS5(~sn#H^W zCjNcYp?x>l^k;Fx>YtJgq@~9!eP;76@?3T|#i0a-)D=~M7!*93b6AVe8mF+skc;#w zzA0zxK^D8KaTrxG5kxXEk5b?)r{N>qj}l_jeUFe9dma6xqB5X0RKMSH0?QDpZx8xA zO+@#E<^$nrF8j`$6;G0#UC5!0Yg>_@81M%Cq(YQvSJur22}n$vT3SpS9Gt>^>N4|3 z>W@tOoh$!qxf!k}npNkq*_CM>Pnu*9&`p~NY9lIMHY_!bs2PVo*W_BfdW>^su+;~D z!oZF&w`E{N07on>BZuJ-#7J?bHgyMpZJli4XD_e)Bf0O9wUUx;Y)I!aFA7)hz~nTtTmAj}M!llbh|*ej7W@kAS$gA&x9cdBJ_lzTJrnT&&B& z&sH=TgeTA3qQ{Mql#I-Jei9fkhvVu}i$?EgCA~FH80}9Vt1{{T4c*2lY0~6yt%{zW zTXnhwcD*4OyPC#XrGVM!jC48Cc7v#)IXcOc_0&x&2?=R6_*X1 zmc@Xb#fRNA)vA=>dJwgtq<2)w+G_#07@sD)=H;NRB!4$ssmUbc2iWM3#WguIhFj}p zKr=k>-oiwA*fC?Oe@Td^ov()Com=c9^CGaHK5l9t<YuH+y})9!4%zc2=4i6XSV7wF_K?HbL_P`isIl()CBV6^b*0LO z#Fnsl3&l&C)_g5YT5DF@W$RN>GDoabBs-r+%+?bICUs%*E>CQODa84GGCV?$$aKN@bv#uA zX|MXlN*#llQZj_LE#{kLt8PFvEU_b_o}#%J7(?h7M(Wn9M09B!dkGB>)}`UKFLqP! zoJqrX1Ma=o;yjErX}^Q5t0aR`lQ~VOHxwBI6C#Y_~0D>RT!VgN)f0i zPv+$FZTn1%X+_inZYaBL+fS8Yh(}C7< zz^=^}@9bMC3BqOE^P0=T%Q*%xHf^nN{jwZso#M?7C@MFFCdAxMPs^Af*eh(bVhtZfmXU`lWR%MJc}`bSpFN$=36q#Il0$<8%rvj`cN*dK9TyTro)=fg|UTZPUaa?N3DyplaR$B6Jcq8&a?lfd zzVMw{-8I_^v0E<|cNg2WVIDL57ur_ul5w7^i^tjLY~mIVR2BhY@*5oIWv?^y5X$F# zXJZTTH1k68H;r*H_C_B1;Q1r|qMn6F+iDxqAe=uC8K`AMuKpVO9=I=eH7n9#u-R9VpeiA;@K3C`;Q^1_6Crt24;k&H}cNiQRil=;Z8Zz>bW z|7w+8-wFQul{gc>#{^K_2>tG=+icj73WQ&Oq%m**6e*@Q{Y{)|jFP&Ys zR!D$6DK|I0qosVl)qZk%=s0I3A*f;<8LVjv)kd*k%uy%g$+KEs=6^00^OJ@-B8%X{ zzzj~5!j5beq%7Y%!0#X|%fO5n273hS=;@?);8Fl3!zdbP4{O=mf+gtO!}N6VJ5iT* z#N~w9HcROPoK7Ky>WXile64c)BK+q{eRf7^`y+_pkLGI!L47;^Fe4N=USyblpB{k< zci%35!|XEn%fsJycmf@XS&z~FPkQs3FSRXrw1;cq)+kEOe2b2oBitl|>9=_1o>=n? zC$|}&>p(1qN_q3~`25@hdTa)6iHLJxDbe1&aY)p-a`l;<;Y4oL&_GP01PBpJpC&yj zTGarR4A!1Ka&rj;{N|sTA#>gF!pBTUg9dF?uaVrs zRm3Qe!iwi+5njyGk|j&ta!m;@cHcxtnt=>htT;@^ok*}wa&mhWf{k(gl(C)PNBJjL zTu%_Wtrc}0-iuZhWfMPDwOEPN#dOUHa}-Cer_W>zuUMkGgk{bFh%PpayWIf0a*~sV zNJd=?HbTX{(+xVZm76LC5#P7|h~>Q?_hk%&-@j+kku~-fr=276k6Ch7ZdonD{U%42 zUh;{K5x-D>N-QpeBlHrC?*|^kyvW%rpab@Xe!-Wsrp>G2=c?l%$D20>l&|>Y%8#bt zh25m=!q6oTxr`-^x2mx*8@<6;;)U?M-ZrKqe(q7INEyE-uIyQ)=djiiQn{ z!1!bhqm7{=N+-kQFy+H5XvhuxgJ#>)P@jBM4I`_H7kL)7f3-vobmcN^aHr#THd`Kok8!hfn?Ixr2y^^$-; z3pY-%`x$LG?PBQi+XK)*xHmsw>4rilS-=GSfZmE`yP>%?s;?~tL!5dKKP+~8 z>wGTorlGvFR^=vM7p}yHaXSIJ0@qs;n|Tf4d^e%1RZqCuTcbEAb1a=N;__E2jpW2{ z^A~U9rHz?W;M64L#@{sq8N&a%!EKB+YY9auCN+CGsNuz~ty(m5vGN!l{oKaq8&NL= z===O}s#fa4m2xu+(WY4MZtLCDSJe#8u{ z8uiI{y{#hX_s=&!qAw4ni$uQdfOXA-t zs^Rq6cspnny|mlG-I7sBv5nM;GaAk3lc}HoH+}z~w!sy{r{j53nRz>PF_qj zif}^rw4<2{hLRvcdUF}s?fzPWWLDYA(a)iLrhS-4@jMR?(d2m#7oQcEpEJrWmT{jy z@(2_B{w(5Ze-5u);Z!C3HD~8Nwepf;t|`x88QL*OPzC<7G#3obFY}!`deeWHI^~4m zVI%OT6-|GgQ1NY1(U%=dD!bnEUn|j5wiZsy>2*Yh-CQ|(-qME+`n;IO5R;B^X}OZg z4l11V{%uRWq+s!2mdSEBxW5GX!k%q>jG8sSTJ$@PEK|*!Lc2qoJ=}Oo+HM&c{@sSs zDD{7x;OHpCvK$A+>XvNB2;Lt)xx$eHpB@%Cw(>F;>PH&uS1gpm*(`gKSUFsc&TecS zIG{YLmv@1>dRo8749>ejccS{yQxrFiEw?Yc^fiPaVw`9gD_Ri+KaR|g#1Rq~&2B3& zwmXV|qGm0z&0@pK`hI&p(2brq*KDI0f%YMQeCWN~Ws{r~arqE={3^rlQ0J07gAeeR+*3U_jio z1^Ux2*U|G@#%-!1Bch4WvG19pbS+(z&IvjkF{c;}kIHczY|VQT&^Z5l!ZP1Ak(N#w zF>i7`eVKRyd#uyYNpjG>{fBH|NF~K>lMP`=##Q^#HPnE6WrH%)B#rM)-hMuYQO#CV zXgBa?z$L5+Q{5|MktjlRb2CY}#cbM?jC03@SYDNZk=6QXOd*zNB%J6ySs^jMPJFzq zGi;9W;`K4=wE5V`sj>SPJ*Rf&QNBywvRuyPr)efUGgPh9CgHU{c|;wIQ}j7M*wqBo zohOHYBRny~Dhk!f8xh<4eKCef$$sp|DDGrz{$X(c7k%%h9oMsrHoKP|<^S-Lo1iM- z$z<(jHJ5)5Gvzc3%epxxls6$muo6lU$w2n;*3Z zXA5nho3)wCYT)E=?s7kt!Eq?pF2y1u{a?~Gsjf~7yjl|o?~c_fx60OkGoRv)f1#6E z6l~W(b{V@^tz5cX3Z7@4+KS!O)!jx4uZ*bccHoFX91qd0=bJ%zgA2KAQX}VROoP&i z(5wrj+K~x({A9goCI7ic^%h+wSbTLZHO=!gY_DCmD9OGUYWea8Mc+R*? znlcPx*UkUs((;zt(bBeTPsL(QXAZY^IaKwp z+dkqr(_hymX%5lWzYD_j6t?ePw#q-YOAgBIs@v7{hk-qlpB_&grB6066{M9xaxBkm z#p;fwO zc%Vo@^?480O7qF}S*R{s%{ByFfv))KGc2IT6M)TSJ|3?iA-d-`pjR7{ecb<^u?PHc z%s&SNi2nJ0TmDl!b1I5PpmY3J9={rPDNF#x4a;K%VUipDAiFvMZ*h(49L1pF;?vSc z_sNHNsAcs{GSX<$9hAjK%f-0a$Iob!NAV!uCY9*3QcvoK@QcQVaNq zGDAfwSVLnTLGGx*Ym~*8u`f{&${`05s?A0_1Dl({DFy)pqm_ZWr0(higKe?bGES_?3;fRw%a{ZifrryHyBtD072j z4)cD#nkbMiCp}g}2A1}u2Dff`=X2Z}Rv=#vHkg9MU{~W%fYOOe?+^5`KaT5lPw!N- zrNyw}KMjmS1{(2Y3okrykbOyT;r=3!tj8Hd`0J1oG%z2kej3zkb+OwQU~e8>{JRD7kksdLqFOFy8%PngU;DHtd{v(>ek=eA$Y{CzSPk%L&*REO$U(r zmI1V{WO`D6s^@~>@N*1MywLC3qs=jL)ROv1NSeF3^r%HN&qHY__mVyQWTb>gR^6?UYKAcE=aX6m|Sd} z&@rnMVYf~J1GV_*{BgSmu>QB4pu&eYxY%KObNJ%bgpv?T&l{EF9}G;eM?SUR|HIi^ zK*hDJ>!QKkf_p=7Yuw%4Ey3O0Jy>uHPH+egL4!NNg1fs0cM0;kv(`Rm?R#Y0`C67pgCG_ zfP~$j{`S-Q%_A1iH`v(l_evEBWPEpD9hdTN^gQ0(7e!hq?Glk7l@li(@>OxowO6*T zgw`-YFH(O>LhW!wIwPwe!#!fWskBEL4;G1_|Q z6w2qf_>S}o%dyx_S4S~2Es$eY-ra!MvrH+0j)uC0OR7_c$$@Wh9>DZo^J1;gk*`XM zVdO_DSo#}wFIsEt0;VG zYkd(;Z%SpS(@+Yej!vsYhwU~@U7ob1xGIhMeXP3RnYoD#5C<%}Mj$oy`jI`l38A-y zYRf6!*J6Fr`>Hh2ZQ1MP{rl);`8%b^=T1%hc(ikxA=_9oBa(<^A-sgwWS?#CdO?i?khb4Z|w>G*f~Y@_p}{P24)(U6fOvmms9E2~SU>|;1^5OR*E3CfHIGZW*`t)oy=@~# zX6?&S;GvB%j#1_ql3UGG_>LMYy??k8B)l3!ri5@aQx7In5J2AGHBo6JnHZqR^&jtF+^4_bI_YU%OjT#+a zVXzJt72YL@Ny9L2Ti8@|mSn^k?YqlQrA*?L_KvUV3wYV?C9d7&@9#tEW?XI`&NhF; zhuAQb7N4?z=MOYK54vdGTBab7-Iqc|j6loeu?hYBQPe|3OBGUGtDX&u2Zpms&D{vv zrp-xd)YN3^@;ir?{nj)jsqdoesO$HWB3OF#9O06l2y1eJNr--#+QTlt~vAi-atoF%~)9XUbts zN`0~M1Zp}fUDOPW&nJ+ppEn}3O#naLj2t1LYnaq(kn<}kW!1Y{sSBl!o2DAhEycT( z9y#YshLpa$9lMU8ZPI?rRM5?sCAGm!kwe+V`~qjakEv5J?uH8ZEg9K;n)Nk32-2oz zZ6+danHqfu5;XuB2A|*E*?SP0cCBJZ+vU*Z*W@Y!S80Tc0!(H`BDQK<=My@g26fR0 zLl%7MuZ%nZVd1qg%?G|DY|`j}AGe>%q7-*o-3Wz%YE+bv<`lDbC==Hw9Pbhk$~}9q zBDi6Qn{u7;+eh6@YDnM6KbJ%^)^;xteqw~bIJo^@t;h_Mqt2T`v@Weu3L#s2Hs@`U z6$A5~=HOA32#Sw;y;`!|dFkn7;36iAxCG0xmjU-ey$tuB3d7L)W0BU%a%rWEy=}5g zIk^^ng`$pWzYIru3YI@he!6oEEv)Tuq{Gk7HEzbYnq=dpV|bmVg!)2)@ITT#aIe1) zqgY1ha*viLYWjofyRq26`nyt9a{byn*@uSug?`y*;m`7T6+)^gxu|?d zPrN$umQ#|6xVPgkf{mL(xwZHLGNsH(=u3i0%r?d30vn=+=`kV~z9f{~8mCna+;7{| zct3dx=d8-4{HHbikaE}FiO1<5#-;mMe{#!{Uz^_wzG1fx7vw`;K9@kXi9QvtH(B|j z!?PD*XYi4@#qknmA4vgNv08K5kdx2s&w^9Ow)biBYy4aNoHz<&c0zW+?dn{jEu4ZQ zm|oKXZA1=Mt2w4(pq5!h#l`9mdW-!!OHqCn(~`Vw`ay&mXtt0e9p!U8Hz(3cB35Aa zE*kSuIHY7}xd5UNH6t2xA&*fahbw4wwWl_~H4Fw)KW?s*rmZ}W(!VaUj>PZp%Pp(R)Vx9w|1?eH6gaeeA}AuNZ(P~! zeUQPuHkfUR%k13OlbTUWWhP$z9a9piV$k{*=|$UT)g`m=SmMtnPgGGqA~-BP?4XX0 z6|+mEf6s1LIxtZOFBTo1Aq7UfSgB7&PoUUj%p3;O&l#C$G-gTjAd%NyFCUfrGgXj1^8LW}wu(>Q?lIjZaI$)Gw*qy67do}SRCC&Lw>b?O>U|a9e zyf$uSgn_K2L-*Fm9!TVt8RV|uvo+YDK3ryCppLcJyzx6!CnKi&Imuk=z4$ZNurVC$ z-b@Shh?fn{3qHNFmP#PhYk^5jcm}4JnNN(f<1!9m1?MPZ^8I%txC*=Dn2--Brg{yi z2yYkwOCWIAJK`%&^TnGx8gIhl&g~! z9uQfV4hs9;1ZN4R2jkdg^0A~KSOvdnX6YWlHv7VN5za)?eIOJda1*@m#zbi$fYlxb- zCp-b39U3yQJQcGhV?L2wD&!;uuZG1mCTo^%=F#D%Ex&)yL`+NxtB)krKzyNsMV3sV z{bFdzYZ0oZqV~4)Y;%=o0Of;z9)pR6)xNp6BJbT0J8RPP(df0$D8g4Is$5L|ca8<< zKB_m&NtzwM_!T!Blz>ky`z!6}MUJ)pU#%Wo8Ve{?gFH^+nTYFp#trVyPY>*c+mNmp zVVHji+o`=5z1SaXZ^8Y=Mv%^D8K&-7C6-2-Xr26$X6`r$SPSs)^kbbt&mXjfYLq0t z6D@Qx5;633Dn$ywgcQh&xg+rQCdVoW(`uHD;)Uj8B>0Rc*6va9(nP@86yN&HD@1{O z*8h9vFun?Y@dUm0@aFiGsP5v4VsgeC+53zK#yAu*pT+y8I_>W)w{^!T0xM-`rWxb?gzFT75;pfczaAB>~jxu-m?g5_T$452>~%r+)~Y( zkx^%a+~K@wDs$orw!oCK;pVZ6UR8EO?XIzxoHOgg7}kiuy9aE)OlkRpyLVhTX~`3? zSxkzh;Q zrzu&MPgG>WxhZ0=SBni;v38!Z#nQP5f#qprVKg)!B%;Nx!(s$By$!1rSB#nHYUMAW zC_($II7ln_pdUN~VM-eEk%e_}F4CUwII@8zd4ptkEvdsSJlhnbs}gT2Iz6|5@KB7U zEYkaMtC5!R@|rb<3MwrRnG%kl2wjqehvI@+Tx^>AQ|O0!vQd;adfL>9P@5SUT?_|b zUSx{mnqmE-7QYE{$Se7&rGs1dsc=I$r}fWtRWMMyJS}8O(|(@qd7sFf(TeSavhkug zr`TW$W<7Y`Td;IR5y=-Qq9I;6kH7O8QdRrRQ7&Uo=j?KCKVdzi(LLWk$oZ~!N%-OY zy{6HRVW{U#X{r=*pyU^rgWrXnT&s$~W=b($d@)o=X8tINPw2_00;qL(R4g?XCgi31 zQKX6C2X1i`DX6;@#DdVY;>iT9dBkoXWW=ZzOO=@LM}9Y5nbPGci@o#3fcb?livH@JGfU>cxMS#P^Qimg z>g?7-PI0&1>c;Drfcv9;V|-N3^<3<)p)JJ(FBDjS(y+bSm9KoH&6BOz_K%S|ZdcZu z3DWR56}}%{p10S<>H%=&2kizO&rS#40{3lRP*J%li#NIE`&HjM{drz*gg8?N_B(aG z_Y5au^-mZC7Gthybtz-F!8bFVJ?d0#!xg-*7i-N{j(W!}Zj&d=-UcrDbft+lN5 z^rlSzd`_O1vamS1yZ7*Q-c zoAR{*&Ho--;ra)*BIaQ0;H>6oWMan84-|9Z1h8>~sHy-#L7;@EtCX6nkt>)YrN#na zXZ}M0m01DoEdSz?bg*{?F-U^w;Ir9P0YFI*8T`%WZ)R`dY6;-s z<^n1L{%sF0W5bVcQc$MTzK0f zA-_fbgbedzD1ywsy93Zr>h<7-Y`L+-g+4Tx>w|BOb76=uA#h+^BwQm4u&eVYNJNQ$ z-bA(`kY0fq^nkcj(5yj9!osEq?yC~MDSzVxpR|ftXaRXBBzz+v{V3v}1KCGeicJaV zkgP2VN(c;02r`lNS1l8DG;@-%wyz1Y(61$l^!W~XBObH@Rd@$zg&P!v>`_~U5ypuU zK6yoS6B;}flKv&)UT2%xPXXl`;Ou0LxbP}0C~d$i{VG}VJFuRD*;&~A##a0QZjl3K zP)UYS@e^;%05yvYSuTwbBO7&ck|8w$(JK4}+91#(eg*3CCpN(RJwkL`&}ZlPv|*}T zJmoC-_-E)}q;m=r=Wi~(ILSic2G4~3#Z8kS`-&Xq0TGwAOtsHd%FlpSzxeCmW7I|H zIw3v;ito^aaACCZS+xiR*^K)=`h@OUyw!EaQ)W*`<>geFtAt4?C{+G0jbRF#v@0S;r z7Wue&d0LxVnteRIy?)<6KEOf4!i0r<3We$=&k?dlc_iz5C?MK~q^1k8jo2N93huQga_+2jS+mVkH%s zZ{%`sG~ks{bq!7+f5FYMam_*AoQck80XAxpru^G@q?h89+>O4I%6W)989*V25m4MU zzIkA5RbGxGZ^bwnpjEDmJq@ZS74a7WJ;$9p`c`QNA^%kvE1{s3OSnY=Va}iS(!VjV zQpl8lD|m=)qYdWNQDI;N2*11qkTyRb)N&>u6r#=euRtb2{U$97i1h>Q_x_ur>4j4G z1qMJmxu){ItE+3hr>pvezt)HP&CM(S3;oml)%tG0!t2O=`Gd#2&{=@T%l^wN8oJ?| z?M7Eg#Q!!V{t0dWiXCbq0COW-7c-!m0)UB`6{xPt3W_4;MsBvQKy@!iv;Pc?|BO<9 zBH}+(xH`N2ziI#nzkg`}M>%k41xiax$STXzE120@IXD9)>_KtM%H9H~Wo0j7?_%{I zbxA8{7gsS$BWC~`D-bLwZsua*Y~|?c;0#~~pX>yR#_~pgv#@Zp0M*=#UBR6J_lV`M ze*LkhWo7DW>7oOQ#oPeUKmxFFu>d$YIR7LTW@cspCnpzxmHBTXhyhIGWaj)2fj@%W zJpUo|FX8_w2lImySjWE-J3Bjoi=7L=1#Sn~11Bz4Rsbgp%bx@;gK2*p1o`kU8V^_w z)c!{f#QPueU^%c3FbyR8rz3xqfR%y>U`1f#|H?T)9R-)c`5(u@9S14-XFIqK<^eko z<^h+vK^_0Y2fis_esDXe4cwtWy8mwD2I~gV{-yg5?H~5RU$y`D7g)=G z2jAGgxWQKcDuMg{cZr2X@83Sx|2!5<#KpwS-WBv{IDleCj?!jU7M896P99bu_>%|v zZl?jN0UeE;&Fr1Q6rcpq$Q5XAkYoH=f0VogF1@0Tr0i@jqs00)Nx_USO?SP&@S4(FzGoZs?9kVqvcLk~f%^lpF zfsVAGxbW8@)$~pm+oxw*NlFf!cpR3wBPf ze|vcUcN>^;vT}g*|1%(n{c}}~Z;FRH)_a`()|SIEoazK7x!e!s6Ds2I-QCQeHM?hG z@#f?m>#-3&V_}jjXe%Fx6JbF^U<6`VLTDi%!HwW`F;fK-)GPP1aeA zr`PRk_yx3ibn2X~Y2EOJUPRyXBlq^PE`C0n^IZJ4f=@t%!NanqOHvMrff$g@r*iG~^^(WqgvS9hNb$=mEVy+oO~(M7eWYc`CH zYq+#`>-bc0$ThL>)wl2{C~Jof?KI@h9^!?*29DzQ^EoE-k|9IALJompPQlcDo+iv| z+H7m4K^9>bMA4pg2-(Gyz@P!0e!EPIzIUEK(lBwtcTMJN?2q3C@CP7uN_XL!BI*9n^FN4xYBXrI0$tZvl-SHUlwiC z7nQdCnRATvjqT$HDR76JOs_o$E-YvT8!}o%@Tq2WMry*pdpaDNELxjcU|Y{hj^~$u zCH&ex6+qC|x00+}8Q@k`uRP_-Rt*>J_EE^gfehF+x{0EWuIT-MF*g)@lz22fF0K(IN}5ll8VshlJUl^=F2c4+ zk;Aa5P8WoMMw_5dmL^t+EX@N#p3>xLUFsn$$EJN0OQ>1#v{Ojv;jyyE`Tp@kTUtH^jpLmzL(kO8QYbxx1sV~x* zj>Iz#Hkr(#t6A?5+~o)B9C5$ox9%_S<2RB=ndqQZYT< zw<Ciq8mg(vvCzTo?+6l&Er-gfZ#H*>54Y=in zUG#&b!NXD2dDi;fA|5%1*?4Ks-l&g`4;hY4J0v{ zf@VM@dO6>XMDpisrUk)j9jOLdF6@_rkDqbj@i z2vn+gLfTN%IYSPk;}#9j_}+Ir4=Hf$=liotIa>rFj#P^23683d@3K=fvnodvM(gBl zfUW0hpAR+@L=Eum2*1yhMMS7rHXv$NRD4YL*toz(UdlnpC7!`T{6U6Af}|4D9TY@h z!S5!ayJcEQ6Vg=NTv9bXQ_58KEkm&!aGc2MP&2NNx#$t1cC+>VzA-#AhQc6^Ha~&x z_tD40qI!zeHw z97UuT)plQT?7mEPVD_n2A9uhZYug@(Aj`o%*s4Oq)~#?U3-9b9PSZKiq$w#?LO2k+ zKM0hpAzUNfgq84{*-LV+emP!^mMV|M)y7Z&> zJ88j&p;p*Ow}l1>WmLp#TE_^;{dXIYPYuW!{1z;=BK>wuhVHGWo__DXlwmCu5lNwj zCo7Hzcv7Wkm{Xenu#&)NBG<1`>SaDIIb@rq#y#Ek$cK$7FYD`qKPxJut|L851YZAuw)5<&Cqb zO9Ii55k$r?%P8VV&YQ{ps-FEyw+|MK67&;VnVWp}%)-vRq@Llwg#FN9&Eo?&ziY<|T;WWjnmH0+yN=+*S;Mf(av9R(TjVbsg5 zvPkns=^^O#C?*FDKgGwPdZJq@Pk1tf&S2fp^f3Q$L1~Aa0u8o6@!%qn(bY0h9ztGD1Z*e`{R5!=u{_lA_*O-C3i`9LJ69#BA^^ zf=0G1LW(=D~vdq&*E!krT=-70VJrLwOjw(fE{K_dey!3oW$F9PF`ZL;) z%b9R7##xK;CR#>YZ24^|hi(saOfPTN;xBc|GS465Hn>+=)$b#iB7O%=D8wwCY=}7X zA3>HF(fXP$#<)xJ(u+>Pl1yPvr(iXev)D1HrUhNxIYJlCcL(K9!4mALp?(_qKvFIN zINS~Ez!J;V_&OpOpctTt(&`-FpN#k2oaEE#LbsV+p3`DZ0Kze^OH4bH2Mkr`HnwR= z_EDGr9QJ4#)wkn^Xj?Y9$Jn#qJ&s1BOT3nBy`|Pt=yyGzA5S$Uj5nn_V1u3t5$-|9 zwrS@pBITXLV(qB#wO<{2OCuyHhAU;2U3^m8V1$A3d4tX4N`Jp#T|XuAdQnLGe2JEB zejl}AK%q=~k9+m=L2uY#+oUTv#oBvW>PyIQdKdn(rF5%UI|PLr^8p=M-$-1kbA|Vh z*4wHB<@2XSMYF!gsY3!qkAc>cgbsx4yXq8TQ-knBnbZ`RpPa1ZLJn!CZId%3HiSPx zh6(O&Eg+wHIQa~iyG{9$&uUb3ma?c3uD1|u?2b)F|A2B?;NIFd+1i(TNw|d4vGbuJ z$_^skJQ&Roz#5@#mbSmOpzA52tw?!YJcfVgo!72`VL~vZC6+6^mnOoxe-$(3UbT^P z#_O*}7#SSA(w&Wk7hDj!KonSeuGb!kcQj^zZ@`T?_I7)a&f|y4cTR@wWr|JtzOH%r z&GMATBPX&XacdddN209+_~DNwnb_h#15jy@#RUiYo%<*)7v9+rDH_ zeD0#?m#D>XFyi$sFR$j+3jg){;lQ6oNVPbm_UK#po5k#J)o+ma1Hu+P&tItHm2}#V z0UHc0dAQzoA|A+H9~n1L^*7vbRsbJKny?MDx{_rvl-rdjsHw`HD=#Ck`1NrUt%7fP zq9T#KA?iNroihoLHsSb|XPs+Wt;JPwPrkzrn|@KvFE(#74w}{=kG~OpL1KaK?MycN zs_RVaxA&%LBUMXHq<{v5V-041Sya?{ zTl7AsJ0JC3fe8k8UAN?p56`tsh!Q1E3R06De)4mIpHaw*NVWL%TWWVP)bGZcat}W7 z`&UhUHa%Td2temiE_2u-BNZoMIGTo*A(6LZ74+&@cnF(>k?O^SPV0SPO7waWXUDv^}{lh z!#)o(g>S_MN9|0a$6wBZ?A}gYi|utZ)GH|F4X7DR9caC}Ld;p`=J4it?I0`?kJuUq zryIsr^qkJ?P9YK)s2*?z@c2g-Xt@Q}>2Dhv{=RpR&nG{EWI1Df>wdLr;6}tdW8})I zk|z&OI2__^n%w$Hh4PTmcFw&$Rz^BX1gKMwIks1z7Hfgm%x~c$_lO_dFOCk23_wN? zM=oI6DIR;s_~fY57{af*=>M{@>X>M<88Am*W=ObRDbJT-HKL)R&br&P37`t6?1!lp z>Dj#MPip?b-jvu|sONe4jnbP|zOEg||2goClanH8eF`&e8IQ3wX0bovhB&R)Rz)#g zRf0Zt|4fcb#;NRtPligxvnOqYg0B8Cd=s`!*%&|)ha4fNm%LZ;bUb=IKc zP4n0C!E3-5VMQvJTcb-dxg{X1U2(&WQld|_SmFKfQ^bE<* zz?wtJMPFHP!AqTzT;18_u0y|>kErMBQZpOk^pmYdEJo1aOjLh=v`lA%eLjL!hP+Y& z*&FeWnqvc!&xQ$?eQgXMz~lOHXF}w2)R*^+qd$&}6W=t$3Z?Z_T>+UGt{VroK-%)k{;c+tSqcyz~+N1O>gd*|4A8m&pC%BkH zBqAqF#)lR4>qD8pdmc%WT+h)m+gN#bd*rnPWi--(h=)+;LM53iRr(NV&Z#d%FOO>) zzZ($3BJ6g^BgaZwniuoT>Me)hC-SH?QmE~uI=96a8qMvJXW&pYPyGf@iEuWzLoZp& zF13|L__9#|$Jk>cHGaO3O(sI!x9|Iz&C!+lCPhP?W|$Wq=|qfc1cWv+4B z+;beYubqBcUg~NVIMknZenuxcr$kIY+u;6FD_J4rGB0jPrR*}{#VxHZeEW26Rf4Dd4z{Tfv=XV+NSvR=z zzgt^BvtM5wAVLl^VlL!1Wj6^)cbzU8HIv)%eB|ZF>x|o-FX|5eSt+H&RV#520!KrHZiSn58aSiR(gv4&4YiuER(x5kp;o+C*Uo2& zr`C3hkS!gQjvb5tG>}**6xP{v0{so~7CzN_FsZnRaB8v1b~Q-FS^iLD?r2fz_-PQ9 zc}ZNjIcNQ?7-WvH7`pRLqX7%sesspyOvTj7RhJb8KFZ2TYnx%nZ@YFCkqL1IgaQda z0@AV_Nj(a}uk*bgqTllH6z7H7O!9@gEyWg*aL@FManeNYw6`Ic$uw~Jo1t%7Q;wF=-i z=uWl80CE=f?9JoBRSjaOW@Ezps-J>tvoEDBRK)@Yk_s2z5A`s*aKBN=OhoVtL ze?N%%sjV44KS`gNPNUKxLeE(pgKWP^-;h<8BfoQ0ceVAP9q!5>WRE}Iy*0Cfe^KAP z#|VOaxOsjkjzKNt%=%dA&>r2y-3>_;D0Pg}J8XcIYH@)<2faa>PkzO5&(LN@e~W z{=Sp?y7uW9-{Hrm#z*x2)t+Os3g8IUssBc_&?X!?mo08b-kItEKvI}v2h%FGc;OtQ zJ_v*wCDE%)e_W=9Y3xOcjh~lb&u<}B*Y&kG_m(dzc?k4G+0wL{+B-0l-N92X!Nl6L zgbCd}@NYO$(K?LmWacJu`su>9k5o$yXG#dO7$3wMBtz%j((YzDbJ<>wJ+j{TO$d)Z zE>cbpci@&fzvma+n*G92(Fdc_4Y#ymsM`TirY8qZKQdjS56b>3gZyPzIa15n&m$5c z@TIs3X17?j+aDbh2aqZ^e!yPy_F9yxZly4HG^6^rh+S)-X%Bv^z2LLr_v)77#!_lx zhS~e|KJBO8K_EgPdP^>*lDWHQ?|FWLiKLC>)~09E-tLtJ=x1l{h&Q-PMm7SZrt2~! zNu3^IR%o**PL9DHUVA?k&uIy{?8RSb7~*uNeS`7OveXSabJ*{zLFZbaK+XyFn&1Lu zbsDnl#AXnPijrQG(;A{r=tYoN{g=I%ym^((H#O!O*LMnGRZM_b3BQOVgDvw}?oKqM zrX+%b8f64^>RN3}iInsOAmjSQI(mXXHeb7y)}_M;oyoxX7_Xe?7% zi>QuA_eSQ{LW$84gx>q@AE=Yh@9GUupu& z>C8#_KEVylK(t$Jl#Y#-o$N}x30Jxi4r{MD_tRL`x-%wDi{^TvKd+WdF?YsQ#?H(g zu&em<2yqCd1RKNg+*IeBCY*j*NxPkK$pReQ+db?$rt<_%DqEU0hF1VPgin~;@sYGi z>95%O*ouR$I9zHVsfz!}FobzSQj+#5?o$aYJTINMd}Kv(jslkPbK|L0CbDm8bBeeeqC#0**kZR>Q0bbyBbZNFak(Ysh~ey?pXh!a zqodm{@0;L6hTJeZxe=QUV1v>rycXrg}5l(<}E!ol0X8AsOI<;IHD>h`0B zyo$NY)WwP}hLv9RU>gOoJ?LF=?xmf`FMfI?EPqiPJ=3OcwAzH^78T@+jeN8j)67Z~ z_PL}CJ*sq+A4k}q?q5sjCK(%w?jd83`@)_aWCQp7gje?8Jt!h}od2x3&A+6FgR+$_ z)gl-irzA)cH2FMXkuhg%Lhd1)sulm6%>HgbH9J{cx+Wk;mz;g!!d(Tyfbr9jvWQSn zcSCVSGLyjj+s`+x$U~2&v6(@Ky)CRUylm8zY?LOipCn!|yR=mEnHV3`?WH364D$sO z-W3D93UslT`vkk$B|S}7%7V6}-9Em3KiDrhIGLyhFzjiNK0^ZY)S_?e(Y<@Aw5Ub;v1+AP zS8CBbwJ~ruedhz@HQTg@7X?N zxRK1Qebf&<-P!*%n?RN0s$sgJXS@c3+A@y)qqVT3nbKDj0Xo@NPv1ECvMTS}_lZ|n z4p*7>{{fo)=k~GxL`CH!MCqlBoQ>=p>`fU(9c)eie}bc6;OqYx9OVWrRskh;Fg(cl zSKq3q zyPSXf0;X|+?Sb0BK5&8Uff6^E4@~=;_fHNgbAWY$`9KM*j|Y_gltDT;L9{>iL2dux z2Z--azyFp4L!y6dgX&?|7&s(8jdBvk-mpkTPt;%_AMUy$YBz^5t*Sp`F$e<7>3{|;QTa{LWkvU0Mr zaB=?|c*)8R1}~WbEUX~Rn46vB-@r>Siu`|om;ZH4{&yHA3p@A!4q|frJBazu^=kj~ zA}$VQZnpmg#4Jp*QC71c7#Jsm&X*Ji#0p5Q_m*ksND-%w*;dY0($M7#ONfX>Kr|b? zg@l&wp`_T!&RlVThTidaLV&18;d0P!wGUeb9rS#(WIzA?bjoUejQgx+Aj`hGF6-vX z-%F_NY~=OfHGALdmF6u$P%h0dk23`sEt&taQFgpmKd`e}Alty(=+KB1J3^UTwh}3C zj;$n3nKx-P%_vOuWBaGr!k8mbA)i|=ssrJGnL~fx#m#CtL~>2r0v*|zs6M`u_S>K1aS9CIhA~sF$|CP~+ol#0-GbVD_3ibKAv%=1 za66jTEi(n@S8FPi3sW^ zfRt$bHvH#Eaw{@v*dSAKcv6w?&^|#S0AvbcCo;5n(h07Kx%eBh#Av_hIMHp<0Mk>1 z-X4-qcQv&sp-iovZN8zwSz{e7mn*}al21;_z)N9Mr5&_#>H<_LKRiF0$0Iz0kwy#* z)usr#TdC0==ttrvzDF0DLM)=%p9_njqr2|ryQT=^kunK2s3X%?@+_s_PWxKj?1&}F zy#tkyxNS{G=7j{aTxfrb+VcQc4KM-Z2g_K$!Vdkh?6WMou#=*u%REYL67R6WnL}l) zZc*Kqi4A@0?|v!RmKpB3>PIkZnU-5QK%Sb1d=EFI7I1QV#<|IA_kn8bEM znu+4*)4aIwuxJ(p0bj)m0C|eBKY&849N{>w>;Ngs+ zs6~QS%dl3l;Gy<|zySmXVrkrCUs!DKydlBL@JBIK)Ro_FNIvRp>@^y(w%=8nSiJQT z_mA{6fc)Nh!uZM(ztfrcKx=>JG^Xx`yDP46Cs3_e|H-v=S4RprBUXl0b8kDVP#$ zqXOPaC8adL@HJi-Jz+9yI>8QC*_ZKcj7UbUjcK8-$U_=WxDFDyMyXe%7Mi3wNBpV_ zq5l4#zmaqTi`fU%!!0r`>Gt2|!|La~Nle!{RxF=3hY%BZ>5%b#bT-;!;$^*2W|^E& z1yuHCFd`CKvEW5_39xVDbr+BZxcHonxvEIoLy(n?;U*Wl1vC%>H?^?8u2%ZLZsrI4 zVya>0YdrTr{?zVnqE^kp_cX)s1S1>T9fKU1TThhQp=06pLGP4j>L;tVLM7)&KIagG zfU0g;O5){|R_xTMe2nfQV4&|AHVkK^+}^56tENgL)+Ld}o8#Ghi3;CxX2<4Nb%tX5 z@5#hd`n&G^z;z+tAOU_SE`K~zx2e3?L|Dz>nGNEjS!Dc(4XXQ153bE{QeqTTgEvmF zl)foLHH1FWXnR%EUz*O6X7_^Buq`5+c`BM#sSlFb2@4vTroQ!XH{pDGg{lf8``uZb zijB=Ne<7kKXD22=#r3lir#ylkDr(u-_QwG1SaM55)IOudxN-532etW*FDn!5tji@K zR}IjIbbJk}kz}p;Xq|X^g z;kZYyhtf0Xx|m2Nh7h`n@6g4CK0Lx+bzULEg_mw#=rq;{S@@Z^!Rq|Vqj!P#DDyfCiT-I-~l!PdOkRQiZb=#+e*o=zCirgBRAzvwT`P1D@xViwOO9tg{gRiS8Wa>W zF{cb#A@f2mT-z)JH&|^A>Hgcu?aedEsd*Rb@J}aepDY~1E8Tgoi!~8DJGjkc@1x9y z3aTiDt?t&DN|G%R&o4tdD4e$HcJf|aq3xhkEmH@VlbKL1bkbYcu?vhmBlGqg)f{oZ zGQO3!)@tqEB5(FQTNAj2P3=CO!Hn%>MsatEL$R@|k^W_x|A^yQL6MyE5h;=}%UEU9&mLXNrcyv4yZ%5{x_TY2VZUI~R@#6fz3@(0&$oA}A*eEEAPQMyQFnByF>RKv0MG$Yb<=es z{BVa>ScuciU&Ah~ z17d$M^qNkYYDM8w)|qfibt=(*AI1`aJz=)X6Du{OO)-KL0Z_2u4%)da9zXl@`HU?J zSe&K0+#XXB*8Vidtfhb+gsFz9RAgAdC>AnI{y^*~t3q_rI5Jd1&HcRUAJFxi|LnIQ z=zks7e&)*%vd^fX<@tN<;tl!9MAs$F2V*D!u@R*V>EPD?p#+P&RkWv0#%4|x^?BYxJ}?}b;QanEX| zW~2}v8cD|BV?x7G$-bzTYJV=FcUFyq8eLMHI$=Y$Lb89t|Nr$ zJ6uxtclY+pX)%0s-jnxH_fc9|&y8W8Bhnva3l;6C zrsI*^Ao8b2(jgbu^w4KoE45YWD`laA<>n;axwtbAXzTpBFj@SmWm7+&loZ)~tgB_Y zXmR)^oeukv?U(SEGWwf?G||3^69V#6`5!Dy7!eP`vcLAYQ}FXga_d&7z1kj{)J3q% zIi&lnXp|9n%_Gt=hvOmKDh~+NRjhU{Br*&iIhHR^ISwC=KpXJS|eYC#9On@*!$r zt*gbi9*Iq-o{8SlOJXI6WHz2`SsQx$T}6^p5A~uP!&j4$+~WD^<*7Mxr`bo>mcrCx z!_ScuDoDlqj|J8 zTgkA1hclURDwy}noDsAeH4$lUvWo^K^yK_R|1Vk0G8(GVh&ANFYSB>Y~IG**aS^6FQk>_SgZNcImb6#c1P}^qdz6epdw+A6;Gc6R=Z9B{G7gk>Mk)S z6Ir8kycN#e@1SYUxxJmgvA6BDEh22eJXL{b&@X_|s^CCnWSefXs7^V3?Jz+oZ?{M4 z`Ox5Kjf#ajX6WIm$tJ39$W|Tk=-{xRhG!MB#ATctuXz5@ldA{WK2CT<=2LAFrvr1f=(lu*91D4m<8pt*?k~Hg&?p=I*Lx8%+3dg@v>vli8Ktka zzAOnL1?g|K`o{OeT0Wh$h;X^0kzSx~xdm@2<8Q+2(v$f+6USL|THWRfVS>Jp9aye>w$m?0&)KnkMNDE{yh6wl-@(t?$qw5}HL0{B8`5y2&(PR7Z*TJRr1iXCx@ZQtDb|1^mZSeY(V3*%i<2tw#W0p6!gKF7(c8U(Y z@|mtHuI+uMZ?U^SYrv#u2p|k8ifF~Mq85%-3S9?|T>AKkECX4lbk*YX{JcJUsNRgP zj+UwU_A>Z3lJ%~7+lLdqB^45+2GwB2eL6fDfY~JZ8pxi@wCl>_0=>LZYCPj(n?LDP z@e|UT-%+vg4w|8&^{UOu0afZ23p%+5+hINg#sTL)N^tO}Xr4ZMSQCh>pWeDk$)q45 zVF*t&z|?k2coDTW>6At~W4!n~U63zRv?Z#sWjYm?0Q*^+n(oF_KD7aJ-7M(?|26v00{nQ>k8C0=yS3*6WiSzrEtF|QqJuo| ztTf#WT@9^oZl6Y=D(Hnq^(^JsH8vNSzDt4H#0_c%U4hNzPmnHBZ)}f_AKp6^7>a`F zR++v&oQC)YD?gkuh3@DVXV-XBeZep~%Ts!fn)lK1a(w3wKiGER6h3n+#* zzW^u}I~V#B2z%3UR?F#AQz?%RhmD+GzC5RHgmqiL{Ujq&DTD$;zX=-VVRVLxXJcCF z`2B!V!;t%VuwVb}r}v|e@9ym22k5SYN`~URc*KsR(nId{8kWux9-E2Qni?cIu|V%)n(b$jx}Dv0)_@7|Dl5h27dJL1;4DIVLjDaA`_DHU zi2Qd~z2}Q|NZPx+cP*4v^F#-dcq>)rYW^|g7T9+sm)vhT@i8>>C7$3zeew(sl}sSb z3GQfbRo6@dQTLi&?RO{ye`Pr1dm6qw2jDzZDvt=Zr9K`vAWP5>*j)FUIIn&a=jaR( zQ@JU|#`TERt6AElA&^NT)W2`wvZ0FO{bR3D#*RsEo77n>85()7tqQPPG5`64W$)(| z;46RrmU=$cHh=i;+{XKHf-EzWN2+^>s@qO_ucL6uvb|op8Qe2Cx2fWw#vkhh=TS-X zahXmV>n)pZxERLJ$-?2%>8dnknaxZ=OVfv8fu`DUwdJ6=GdzCBL^v3!C}`F_wFrQr zl)^K3A0F{jR_r6m&%sYjhX|Y9&n`;c$vVc(X!|zimFQg`JBRVWwAUs<$zda1;*9&%U*po4nmJsC z77Bu4M)onR^qYv8^wkPfkmnuBoZT&1yWehWf;KfwoH$iVA3<&`SiI2!+z#%iNAxVD z{P`gta^-E$$6UFeZq7iTedB7x!cz7Q(N3T-BYeRELCOqxJeK&kimy^XOpu93w6?ys zR?lAo%M5Gw4pBZF@hb;n*ES!fcJ>72LEwlbmXy{RryLSfffjY5-uVeBv{2aqmGfwZy@*1HW!a z!d%fy_|zJE66Gr#AOfsNA5kin0&(`m<1<=kBtm$1NH`;!N_kY&Cwx4Kh6R~TsN4I~ zJ}oMia_Ev?N!GZX8S`V!?miYoyfUSMX+@&SCvf{MLtrtS3NUEPXrGY9ooz_#v3;ew9gOtYOpTBR=?q>;+X)oc1E#d;H=2LY^!K)aEV^rT3 zz>;APU9O76EM+j`MHf64Y=(aU`xAsO9NCrk3^pVPADN*JdOl{{P6Z0no|$f`?orZZ z^M+N3Rsi}xbPfJPU;bZ9Wn%4W;%s4L@ISW-{x1dbf2x%K7pnO0&{XIj-T22woc_t6 z|5XkZauUr1_m;9d#qs$x}?5zLYbNpMaS5wpqv(>Bg1hGL# zqPPG7jXpLp*;ffMB7WC3LAVN68L{olRC!attAOk$b$EX{>i+eD9{bDvbsqc6W6k|@ z|8|OZcwZZ<=li{l>-Y0Ii2Lj7UFCk&jO*tkZ2R;1_4aMVZDupS;a(f9Nu_YJP55;#N{GfGs@=e%T3;9Wz^jS9}IZC&%IsMyJLZv6}YJH*fg#Mq{oT> zn$Q;ltxlh(pKC8ka-|VqrIihT+Kwpp@whU~M}g0Mj5y%Y)N|_rP$Q8hHWwsG)y(mw z7tjVZDQac44Q+q5vt<^m?MHWeiqp-Fc$c+U36`6xKbe&EvGw%6a*Fl?R<&yfUOb$C zyLT@KenJ_$RfT>l){hXtik6p&Aj@|BO5>f{vI~B$McUtvXk8)-@j@!=M7||-x5NQr zG?_(ny}yygRM+8Yw^R&ZVYzfWnMUXFu2HU83P?OX{NzWb|@%YS^)K@*vT#A4Ek*83L01DRtb{ zrh5FGv}oh>YnU-_5vI^(6t=f=!Lx#ECYhu^CU?j3I=ihv4W?L^R;Th)2x0;0m2?rn z5SviIjLhBbhhwU+a_s_mzNzxJL&4pq_ISB&X| z^!QZ6wo$CurFttBJRJa`Q_Y}tj?9ESg$P1Tx^F+#ej&;-3kkg)im!SiaY6xnF4c0| z41T3Ocw}xh-X5q|7Gh=oMd!8f$J$41Wol3ps|)vnk_`U2DCjl`(KY1AIxJM}-&lg4R z<^ihO57|LOr+bX>a+LatNu5Aao%XJA`Cv!o4(f@xOKIUU&)RQ|2%+8EdFA0^rcs$7uJn^=Y)WS6^@2DzS$LI!%3Ph#5L z`5n|!KbOJa1<^-`W-)Ak>?85=9(VQT1$hnW26>IHQ{T#}=W$VoWv`V)5e?X-sIv7w zZxL!V%|&)n^;gI{yqj*<<+YjQJ~FIyS{5uUTyIPONHIaIX!!np`R)|Lkl?mVI zpHV1^^$N(sOYYa=4G<(WivU>-_9dO%PP*;0G7nHsZCCUQ>eJw&F3-qU`gUu{KnNf= z>Qujq*KgyG*44ernASOQ%IH&HhrYCouM`^2?U6}~F4m3itw8OOhb12BF{cv4svz32 zpq;GhtbVskfOvNB5L3lc=V+*yWK2cb;0w$!3HX=>HXkj ziY&tj9Dmq4S@}}Q=3Ryn|3T;Jirgzx#30~JR-whJ187nu*=O=PfDlub=acdG*wt~k1fWqb-?c&DQq?BHcmqT2OL@l+3&?)RB(YeP(| z%4;DRY|y@OjK@uDz|en&5p@v+{AAeimm=y!sv%1zs*q#Lm2STu9iNo=WQE3 zDZ}&-F+jG`+8INOC}#;t6N4uPY&ptSi*}WnKwgR{bPckYTe|^St45@zUvC?9_*Fba zDW!m_PNQ(weBPNrF0A}WDV;Y9E!9@FTXUEP15f!Lrs2abCL3U+G~+N~Fa{vi)BxJm zL94Y!7rC0<7Cv8!FfT3pM%|jZjoLa>opy4m_HMJTWoa>sW}BG&`7Dk<+e#-ZR3mKOj&{` zj5d)V>8!^qWn6cuf+%>|hAW#F*G9ji=S}7Sgig3kR}S3{EYqk@oj+{0$hmPt;8NLJ zEsmOz1}5(dA_HF?tGC!Ra2zQ}i)=!uAT+a98!&lnNzTtvb9)K&0x7_w$F{X(>!}jkq2W*cXG7@-fDlD8Q7jNmu#sE*$r!4= z&$X^z)COkvrcSP(#FX1+6*`k1bYsYQ$N9cM#|Y=l50I&_68<|}Egbv^^2iqL&6Y^nqxxlI@mK*^?;Au4y#Mw^YeeIeOZd=GKF z0P^3p?}(ke?WJ|I*FuBND2&!f&v_TM*A43TBd(;^9(T}r*OfV#@=g_pFnA$V+lkc7 zlq}2sXK|}iyMe;x_XS)vfpoD;im*9=0;E4PtEbhpLsx!Lj;}Kg$5Wq%DJD4Hdj+0! z2tX$y8=$0i5I`y_K()I8_@hDQKF69*=6c3XSrzi?vhB6u8Z?kV%CMx&TLI7I=~12z z+?byvAvf~u2dsx7(>)qz$m}2J!0r<%xOGJVU^x7CEPa{ZhV6G&5GR(9vjJ|z{hz`0 z6n%52i6h`jAEV2@v%X*cih~1<8-gdnVC!kJ{CSs9NJy34N~wfm(g@0Z#KwyOflE!4 z@6Rr}*QQM5+$B78JW2r~Sd&eYVN*1*o%i#>4M(R|%~EHF?(Izz+{p9FN<)=O zdSAJhloBacYW`aHkl2<2nzNZZy}#$PpvjZC*?$W`=ZPiQtao-v8VT>bruLC|h-JBo zV(-u`;RN>?o&sK^t9J{bd4&bE*HkHboMgv6S(46YR+sNzRb6)7?^Yyc!9MPENwbQg z|KKxMLIv(x>g>QR{65umzy*`KB_}2=?NmH^0dX;G z!-IB33VSM3hgXOPokFUCi>XkCCVn98zd_X4tB56V;F;*K`Bnb2?0lpCmd!bxz+BXe`x?uyfgM!MfeEYPTj@G=mSuFhGH0!2*#X84tw?0LHh{g z!X2zmVekZXb?>Lao%)uJwn=)a96a!C8;+8PcO~4(Qn7t{Y+Th4@$(vf;r<+KvCDR7 z-ziK?99Ype>=QYz=X9hDdZFo)%utquVkH!WtE3^;dgE7O@jaCZ0=CP}RdL~d!uPx9 zmiXtsipi^3z;6+*oC7&;P_8kwHM@uVyXshmu37XLQ)uQnK#@IY8p*FyM75Ely3VOA zIW1O>igDO-xd5NmDYLvHjwa*j_)i8zJr zJ0(*QIyQI-7Shl$6p`eVMUKy8-ew5cUmnSLW2$stfU|-Tz~nXL`6pocO{S68FMu!h zT!_Ok+~_5LHBfwFu_w|YHTVQ-V;l=sle8mgsd6SXg@(6n2Oo1M!b0*|IgMDOzzY!&~9m*6dl~@D8TGTu{iL3N+F1_)c z?D#8|uAI}6$FmyuGfmM>JZqKEH{CmLHnXc!^#xgM3&Z|f8l>c%yy z!RA)D;x2tJ3e<7Icv&1%@oR(RIR(~lv&+*-w(T=^3JHaGfpPF^@4Yk#1;{!;*W(5Q z&A?n@bcx^)q;&P=$V6=qg{pebDm=gTvHp z){Z37JXj#YBe#z~H@8%=J<#}EH4R{A@$N4_2Z%mV-W-x28}wWzzlqz9+7p0k4-SW> z*iF61wC8QOk#e#R)UHmXa%%arpur?H#5P%kVP=m)(9vMVh{UFhX>Iaj{(bt@!EJ=!v z^%7oLn`aCHSSnR}(Xzd8BYxH}EM{lXG{5}YJb-jtj7l4f02u29pR>v|ASkvUQny5L zlqq4Cox8vL#|QYJ90Ijj_}twXr=-YlREZfs@=98Ts}OhZLH1g!96@Q{wH|S~?MM^_ zs}e0DeFPJ|xap>o)6a4GhdrPO0L_YGvBB%8H^k9(Qn43mP1OEA?jovYKuh%M|W$9ixNY(|cBtGWdJuG21%q%wpW55{m}4c08}uU?x1r9-kkhR6*pPmt0ONyGxV~zCakWz$OJ2!7b!3KLD>4xUHC<{JpZn;(V z%K7{IM`x_&PQ*XKzb^CXM}3;45PSr)0@T8|KH3;6+F z{QSt;f1R05F>JV(+jW;|6A4`fco(2l1+e$4c&S%)+Q55tL9nN*Q4lUvfnOojov0Y%U8| z-J|;o7Im4g#(nxA4cuv4w~86J>jKvqFN}jbGCua-bdi8$b)z*ia0TVAsVTX4JtmhNKVC0c|ieY6=*04 zxR)0Bjb(4YX$rQ7X)(v5Ed(M3m{W8TjSg~^evDcTLe0X9N7dd^6(VWSs1D=)i}m&qRYm(Lc9mQF}JcBPdoin}1gRcpyre&lQXFJ}pbza(w? z(7hdlB|RUbALNu#l}86y4$eE~i0^DQx7kMTSGvhNZr90XVKVA+j276K#+mSo?5!n; ze<536kw>@6R#QN142G+qwhra>SINru49X$;5M)XYFxv!`NRxe`AmmHB{ z{!>p1&cRF+;elc3Bf$hEbD6EcSuhR^GDhL4>1K7v0YTOYX5^U^A?Bk+*YLOSj{|e# z4Sf#bPouU0uo56VVaK7-Sk$CTZSCCC(TMNh_haaB+UQ;Yw9{GhOCRvaUEK0>@I=!F z?67xMOhz4&|^ zL=#yvty>x`6>V)Bj2yH3a^2DTV`%BS2&#VZd6sL$I7C?7xHjl4w4u?XzI?94()y!8 zh7tXi4M9UULO0|w9hUe3f_u}~WAY~emCSEe^&BPzDzMBB!^Db8p1BynK{?BL%Zo>! z%8<~}&{O4iN}5%Mhk6|2L8O4I`Fj$p%#ZLvg`5Js%iA}kLW>k$Sb*u&X;VB?MEH)> zb$qp)RIRj~dO^Y4rR}pr5sL1YaWYq1lM%t1hDyy0-(_wluQ$bjFYp4Rr7V%pY($H| za{Z?~QH4il+B*EAd-pGg8G1(UpWUQWYNDjxb z{(v?PQ^#qXxf|om=w`hh@!G6Y8PoqLcFWeNMF5=W)o=WHqUdm5+ zd*?Z00*}?mg+6XU%_Ru@>PCCJBUAOszboId?1;Cz$?E8cnK(Z9fT?;F+T6L>lL)lv z^5tWbncAaI=5$tot8^CM|43lxzo0DC6!3=x#rz!}?vyVKY`#ETR^(}(+a(;;0L1Zx zSKA-_lOhJO9sR&N^!yT@BLEzW+!fD7_`WPmGX`8J>d64hF7K^AtK2dDNU7c$Gv>~H zet$31!PjZ;?I4f%XEb(O=319dSC-ki`)~;yjS64-9BG1@;>t5%5l%uX;V+zs-exFy zZdJQ#pY#qMFAQJ`i_k*Eoly_cWAY9Q;9;Rea#C&U!|fQkb(Wb#zW-e=PVPh5dGPG^ z=W@Ww)}H=6-*J6c1sm%8F~4Cg2=3(M5Es2KkOcnCAyS6rH|)D$EVKp_FpY8?{I0=_ zECRqE2Uf19rkn4_6g1;65X~?RdK#M9hFF9gMi6(0(2rgpnc2Em7Y!5Kqb*WO)G%BmWX{ZC&AKYa^EtziHVmlDitpSma zmU9pkyp()Yvqq|qYJNKb7+0~@gUJjubM*SK>F=;%%8D>hy~R|-kMgnhybNt%4~MUO z?qk3wlLQCKJ#}9*T>dEeb-idWsYl!@68{GjvFwKcC>=ca{+RphM9?>uho0X(HC|Z5 zTS$P^PcJpAK*F_A524yWULO;6d?{m9$l~t4yR7c{AP)l?a0C7iWJaBz#9+&Rl#D3* zMc14qEb&WA-%>Qb{@3Ql``l%soaS1QrNTs+NI4UnFx#+f%jO zr6pyDozpt^;v)j=6|J+e23IkTCX}TKEQln94v_m`>1jsDqh3M8 zmMx{@x#oIu3=ts8(JP~jNgj)N9a(bYK(=i-$!Y@_;%#eYocjqVH|;j0*}BZ%K1Dve ztkFp#mYmw{0iHKo6Z3DCj(;B9)}q^M)z&1?;R&nQtJujs$3Hb~oBMeKp$YS#cM!p- z06fxvHtgI&tT|wgbQdW*)8WI2Ky>1)8z}({29>+(;UQ~BYCPAU|L*wgprR!rr6T7H zxQiwUZZnTD<5yQgx_Fi{zOV9yt3h0TSFL;3-97XGwiE-I*GsuE{abcO3Pnz;rx>>r z3eGJMYm;nPJHZk0J*U1urrvX0!j$8^#rW|Q>~=}OMMLT+hGQtcW%a4Uw)-F$F|`lua;#s6eh1 z97h7l?D@QwT+MUqiN@F@8F!*SWCdjt=8pbNUYHULOCfLGNT<*7xqh0t#=3wPrBgqM zpd_G3BZPI0XxLkPgwSRf@Ld=yPD;l@dNrB1VsoQQ zg)jrHY%JjK2B3nURT^QSr4Gl0aQ-gVp(2mj(of7cWioAi-BhiClcvj8 ze?+RbfI*C7w`bWiGMpSyw|Jyil2>eOZ5}F5e!ypE8{F_Ra(3AvJBX!UudXgnjg@tg z08gVQsTKlqeQq$yUH)tAJ#jow0)ND%aDC^Lqxc(Ra2p|Hm9HyB7|8pn=VJw_r10{ojf^k?qHW${U>%QjM>&VG=_(r<1z? zElJOQB+PcWiPmY2t0Uz07<8mThfZ;4yePFR-3)e#0dna+V)@xhY6;Hc;@3;X%}U1h zredtdJ>RBEjIo5R&^ND0c3vRY7!|qT3U)p=hDr^ovsX9BS8^{2)gSzXp_tID5TG(C z3qC)uz<#R=CUlHv&kwSebj0LHf%FT;_JO1u($!VC$V_z#O}ro=Y~h*AtjnB9_A`z! z@C|W08!(l0wdHtm)!6AXOks6v6;pn+v(^nKCG2)E#(ymmi~HtO3?{ac1*?m!D9!Ch zuj%o%NHQxb9Xf7uYp&)KpM6TZI|6>72G@>^4_VQ1M=X16j3|0AQAL9bbxzZP0GHXy znROQNnezH}`3}NO>HEnt&QW5-_0qdnK|Z8&U&s+z(ZxD#x_e6#&4lfp%b}1kQv}v6 z`U)5Z%6qoA?cc@`mkpYobT$1Ud)6cx=+ob^HP9yzC(6T z=B|#D^pV@z3JY0{x(RV$r4eb-fGE_Fx8lldynuR5<)kSx8wz5c!3$=b`I`}gcmAcO zRHD~t(uNpor$if>sCb*3DP!|3xfaB@Z6Di~qJIS<7Ne!~OHp-S z=4xvj4Xyz_z?`C!ZBX=FkvA3@{t8 zBY|ex{XtpAJ>~@K*<55YLgGNIbF^D4hbQ68#i$xheZMVJX*~z|ioCYfGxT;~N9^6v zZAdu%8s(kP{FZb@E`X|5^yJ^bt^G%#ic)7ZWMZNYbeThl*I-|D~pwZ8^NAr9HACX_zm?%-b-BEHHknz$*FZ@MgbBCHi`K zbG&?c#;`(x8rE;xJ4A6)+}o_+JILNxmLf0(0$g;(NGQ0WRLsog99U-?RwCI}qrqAs zm8=+9M~ED%IuToaUw(|g?}{R_W8IZM={V8t37AORzKQh_E~eyV4jhExF9HpbG|@Tx zEj%46RXTPz$?4Ky*8b+aoG%R#Tt$S@bP@9lsI3sbRW_BQBdG?fBj((C*DGT`Z$h`T zo2vJ5MJ0V*g09A4njW!}n28`QE=BYyhw~adSs6h8>MzL41>T#z!7JzgeA}%#u1ldu z3(YmAzH~b-v;iUMNd3^7=ifm^VohGT*71}{&FqOzjs}F5GDBf3Q|k8lNeD>)%L4KI z&58iAKC6I_4)3n0$~90Lh0|esA`F>Nu^<>@OsijY&mZ?gq5;mCs>ncVTt!68N(J^5 zAL>NeCDzK&d)J(hXNq(cDXQxDR8HCg>9UY~%A>$bn;TUpa9MzIrw#k;6z5;29zEKv zdO_-oxMpiCEt^yUY+5>HT3Tc4&f>P(yObwk1qXZgNb8zp+v-*H7AM!zyPh=D(9r4N zJl>PNQZ&_+RFS)w+>?i>seG ztmi8%G6VScX{9Mx%mDCbWVt<2$vM5b%YVvUshvVcq#sz!*zd*PC^Olh|o6 z7JG+!5Y0{_<&W5OW|gKHt0}oFecpcV!Zs-pAfK{{Y)K9c7<5pC3s*dgaUg5!cJ?s_r1zdb|YbOIu=_7ii%@eB|WIt)$%k zZ|L%wDIPE~1geFubq~OGMjIU&2*;Y=v;3VTA2h~1$jxz&!f8%Zyg1M-S%v@4l_(_t zUDrED2dLVtsUIT(Ne zX(#DpHQ7!v%Dh)19Ud+J0o;!dBA=5NR(Os8C$_!f!M^HoQbkFu$H1H%j7P$Ek=ljp zQ`?6_d41@g{yiOxji-Gr;T}X*#n1!bif%4>6VBCGmL1pCjfWgmRL|N{f3idZK~7~4 zG>+|}z`35g*9KTGPhIIzj$fXJma3?z6>-K6DbAI8ff@~30(>!2<$1@4P!c`af%OG2 zuPth3q5Hp_>t8YD+NK|2OD%2R!MNIjMrSoDML9d5TGJH$0g7;j0V`Fvg9zS|yb&e*3&^MYWGL*ic>x&^vLb9vl60zo*zr`iw)Khg zPp&V$2}h0t*if(3C)+-pxER0U%E<*Q&Fn>kgC5WqnN<%7KB*C@ecWpX)})@LL>&qT?bK zQK7vK1&a*JfJ6tNVZDZ@XQ~*P{VZe`~7)FySf5k^ZQ+6XW7&zy33MW zgf{%NnbYf&eK0U$#3Y5{l>CWSCr~<>6jiFbKWm*t&v*6l>p6-|Hr*P1ysg~mJo(+7 z`nZpUJ9(Q_7CZ?c3_JGji3(miDk@2ZO0@C&8ijG`MmI0&pOAUj9nv|z|KktO)QVpn zXY%{*f}tobPl4xc6!jb`IUXk|uFVpdDtXn($7wHjahbosNZJK$%kWvgVDc3UN;h(u zTFv_M-9U(8hv?J=HFfXnd*X|Re@Ni4G>(U8+9d&>&@B;nPoz+Px)S>Lyw!=;-wwza zylsWyx-vT?tv}cm{V!s?q+tW6ZdB?JJi4#A_K1+-4!kY|lP=<4z{1j?r#5I$Z%spE z!U7GAfheke80L||6tu%Kn*3RvBw*Gzgs-gB0s?LIb*^=bD&}%)8+-7)F*|%J_HzyO@o3EyO&8TC za^i(EJnAFA#~qRh*Ww0yD&7IGru`nCm(4`ppQ^CR%eTv36y$SphzSIGfK$+J9BU$g zD_6sa1%Z7Up)#w&N=z>9u1p&EWO~1Y6sL3-Hh7rkT+E<>_NH$Dv!vMAmVBF7m|YY3Y?eKSi2td5M60HAzqJFr$J1$MqkXM|8J!X6y>{8z&Afex;auH`h*=tPqnZPL9 zs?(ktpS5sV1f8T&KJU0sLSY1yaKf?W4Pi5wr=^5d3FW8%@~DxerOVy_Edq7~IC!-xM;|s` zzj|k;(ldjDh@%0qV_*^8z=kwMs?m2oSZD>tqNa|NknZm<%LrJZ7%M4Zg{03?ga;J( z0pbhdE9_{H-DM$x%BjM{@(pf zF5I<^RhnQWu15Fn%xz_x4yc`9R~ulw+1x5R*%yD16E6?m8UQCKG#%xR3#f0_f_qm% zD9^5QDPK$0B+tnVNa0AOWxvdERepMD39MgpdAJe!;nL-ia&tIRucDL(M$!{3o9+Bp z=x;qi)wUYbvdJBV@eZe=q>f3|%aD=SnWM337E|ksvoP;*-zkGEP0ExBy*}Kd(b0oS zO(iIS@by_1s{h4kCe={RO#|UH}p$YIPBt3i{G^j!s`q7E?M2jP z2N7A_&fsvd@vjYE+~#G?t*3AE;WP{Xd%z-2U3MTT&|D98Xb19ca%_*X18#o5B)br? zFUkO<2u}v*ZjFG=QF2l^k1+`r*S8*ai;C} zf4Of51$8rWVho$~;^sKTahuH>E3x!vBHH+?z8cB)%e6)b)8~iAox4h49NG`6sNlAI zAKsS~eT5PMGKw#gt$qUi<*k6*B%mb1l5fmAs;=(s6D+~so(X)*LDeFc4B(MyQr`)L zOkkajo-oyFNwD1WiZ#McT-TEJ0mxV?Em<17*O5BWopzfY5_23SkCA${T5TQ43c2}` zpxYB4luo98>>y&0*ds+R26V0iDtx-cfJedq@`fbFlzgt2HL(>Cgk6PhS+hC7>NYDF zQlDxFcx9rPAMx1K%`yIdY1ZaXABW`9R<8CxiEq39;^=KO?eu5zDZf!UP8CNu4Z(s> z!Q%4Cl;S+X@DFGq&CSRIl*Ce})#wGhMrO#5?13Te&f{+D~Re&3w5`ncDJxG@>7bJ~EG(N({a zo;7Z`e6Ws8v9DF_LTjPx0T*iAqaapEGNlFrzoo*o8nF}V9w+tsr4dsvt*=qX(;z1_ zg75*F3ZP?hJqEg;Xn5n(tD2)u1cd zKSX!6!!r;#_I!1H8mQY!6%ezng&dmtYmi`hInTnvLm(ptSMFP}6{amN^yM%*3XyIB zA=R4y(=~nTNcHuGtJ2!-ewET;ZiX=_OHwsVpMs({Im&>fwtD^;R!`8@agAKqpZa0? zt@`wR_4qN7v+I~bQqbi)zQJfDUf z1Wb|*#J(XF{7W2>S?Ry}iH|}G@8Qm|giDDhi8ZkPA z@v@VH1%mLx4XO0Q&M)!ew|xg|3j06nNY3iPD21vO6tsPmZa_n2gZ&)&alz;I+R;_lJ$BDzrE*2%2kyuq&LK5IE$b=%3us+8=$0yuk!N6|AfI%NgAy*fU6NqD2HWouu) z2GsfUfd?`zNvc4TH9RzdZH|A|1Dgz0=h$-QNkU$xzd{`V1LrcyeF`F$OnskJ?C;BA zfU*_X=K)zNl!Odk8A!zWJzcWJ0>abhRn z;E$iP@t6lW9e$AL27g7%B~n{Z8e840_Fbn6S^*qvbBMO56$3~XbW+P0mlVs2VwQ347nt8fBwhWf##GWYV&?isZO|j9#_Xs0iPKw z)J?5BOUjm0t=Y!B0593Ea<` zF{lg#j?0^P^lqAfR+<9l!{PB^Rq9r1o3|>VWqLQ}ILRqSA)d{u#kDZ7UEXBA!u>mw zNw&~5HMWXKx^M^CkB!bIlE%kw_;ujoFD;b31rw-<^~GduA8Xf@p?uCYdK37wdD2ZM z7>`C{k>%%*bsT)`EtsoL%TqwHzPXovoJXtOQfY=vX$xL+nTL*oVHRu81nzThantQf zQ}?7w=W{FeL5f~3ci409w!*5LTiKh+={zUw)pSsC!_KD%jfKYR%<6)c!WG2Z{H13{ zCQRmLl(kCf?6c8lRg@r9b8 ze=5)uAv`%^se5ftw^Gwt&=OrFwuH_?QM$Pa}he+E+xA`|yOMYS|s~%|oudzCE zKfzc>^cU;yQ&2H)uy>}C8d>aLLG#qN_D^G2dmZskHT03Wo3)M)Ym1HJ1g3KW9zag1 zApK=I0hH9(o}I&08z98tyTm?>KN+$vAY!G}ExtYjOtbII2=HZJ*QRB)Mqi^Y&BRa% z2X#KV1+wz}qv%dK8#5h*A1_8ygiLz1jL^hyRFj-H0jhc>ho`|ir>;CEKfx>7_NE_2 zI9z~`VSSyGxIjq?r&hMz%s+G{U@ z(jc+X#W3I1s#_(BWtejNJ~*>l6=Pl%BJnIc9Hh^N8ZX;5o&xwMa{)%X|6;HO<=b~C z)<04NX{ljJ3F_CGxR!KUgCvw9kNJeu=rCb1!{g+T@hnVFO+-~I23r6IM9@_EzV$ZWHWX%DiCsW1C*wG{wOio~z=Nm_UlH8ODo^7$Eu!xfa8cr)I|+4KZBz2)T6|%P!{KrY$#aY7kox zyB-uFpJB&13l=*0P{`F}@O*QfhRp4!j| zosD!K(Ud?BrLo3yPtpxVLe!~2UMX~agj!f)=4BCDXjv=LE5c?b|4EYNzvq-|?+s_j zaNys?(^v+S_^>BD2Jg~>iAjCuW2xnKpG!!__O z&NS9na1}Q*9In`axot*h@-^f2t@roCtz#o>mi|WyziM2x4)29l2#6M@q=uB+rW!fe zL$8NR#t3u}P(Ya?lEBj19B~0WnJ`tXAMk{{^ zYC0FuC~)H|_vFP|045Y@1_8L?578ciGqc$0{5NAc-vK&`X>HD1xVs+|Dgr2M04p8P-lP2C7v$W%BmdBbZtKzgT*QY(r8S)73)`c32tQC55Aza=n^6jpz=6UD{7VRCv^}?ni>CS{ zA9{D=K>RAl4oPi!v!+hJk(K$k^0{1GD~XlEjEqbs)@8${Yntuxlzr#JQzYiVtNioE zc?r@|&qTeMa*}N_dbqtWm&N=413o~(zfExk=RAAJ4g#*|xU=NzID^4kj74J;@65D)s znXvL*p;ftZjOV&~I^ye>7YxdONFZ7=HUdF}EJ`KSn~13V7RJ9Vh>(-i(M*u&81ZO& z<=B$Q1a#5df+rqd{C{@juZR5P%x1=DG@XvaF!Tjon;3nQ>IyLCcFqFP2I~(7xWF{7lv#eUH;B@^=qTyMsBi1cJlx!t8{|aa3OI zj<+LFjBJOy`$BHl_CV>? zAV4?=Mp=`1Axehg?(3=)_nVK^J9XNee<#QL9~upsavtw*dQQ==TKL$NQlnxb0w%flcanl>TqKHdQ59$4>_ zBwTnpPl_t@(D8knqU-oUCz?pXB<~HKXzWeVJ8uWO7#I{Ppv7wYKo>+Z@vgWr>HzN| zY@J<)`_(*unt9t6hPr`?iERrBmISQ7Y>keWu9P^ua++fp4&%}W zV(d!3&g8pwQz9>)M+>x^ijuOO#h3Q&*KJa@$rND3OC(SESP8=ed}p`(I!4F<^{jIo}?y|GhAfT(e zK&CZ*Pr%54*=*w^uUnEF=D{w>mc`eYlkY4WX~ox~(vw#Ll;T z-^-B@Tu5C4_|q`IrnnoAr}1^XT0Czr`U73NM8n^~L@W63L0JCmPW(u|Yf?c;GD8564-iYFk5sB?9a9fv%yF)y2E#@~p~tYHE?FA!l3M<0M0sf5?R`k--g8Da|CgzwB8k zCu!S*(bVP*(AnftEcT{#sQ z#yZrf{3i1(f|Lz#2btzGq3*%`nrl;Bt8Obtqc!WQb99;u8(cj_a?6d8q;|o*66Zws zk)k`Zg`<#mF?m$G+Z4BYsp)PHw5+wMNwoeF)fCsft+!GkE^pj8o~?&N5n6Bc9kIv( zGvjx$hM`d+U{{KcGR~IA{7xi6><-ecMCb7;_Y@bhCO{f-obzS&v58?|9PW?oti}Do zIRb2++^x}TPJ+BA-PB6;^l5NzSvKg##nEClZg0*G^Z#5|Ig%td4D|JidBFw=-tUni zXUA29elO&~>YDWmBnt#_BoZQ5BQ%GE3L-Pe$H50u6#toeNrFoC47Ci)-6I*{s_1+0 z&pnQ_y<0P%m6S@j={a|)7uDh#4=b)sr$c!+y6TkCN?lVJV6KBS6&9|_R~oHmP*Ut0 z!C9tEEz}^ZJI2Ct^yXtxB!9Z8gDlAw`Xs}Cbk}V!s!S}XzvOMW>(Ww#D&I@mIt^d!d)Y(7mYk~XdZfI%C9C?*ybax%B5s_7 zpc5JDFrA1G&Ze{sE73$Blo_0FL7OBVNi!a76UiDw;FizlzNket-<#X8jA4z(508(d z<0wmTvMEN_)RR98A&PfGw}ae6JYuQMCm5yND}b`6sWvR2M9)q*cRI7lR5G zz(dJ=Cx59ycFL}vVu)aTRCbY9;8gyMmiuts1g7xm4!7rNWI%3PcRv(4QbL?Vr_0f0 zy^=X2qp7^ovM3UVb;pnl1_|X9f`7gr$#_nzGds6Zw*X;}f~eD@%}cEP`>Y?@zLl(LLp0x|(}N+%7X?j08W>gH-u^_C;**J60g6Z&{d&zLsWk1^X{hx6jIW?~G>3{osG=jboA|DpVL?1#eKGi!E#(I1 zVpg_|wsT8elem^zt)*g5^(Eya*n(7s8pFmtjQhK}gUzazRm4Hs(2QCKGem=6Nzzj9Q*?Z(`PPuwL^uy8*uumo z@j6uZgtqK-I2;&S)A*;?QXXa^CHSMP(;7{d4Q94=vxLl@0kU<_`D?53+mMcT{A=P%X2IT$`B1TOI@Ukqm zZ#t^Wb9f`dV81W%tLUOUiU9D24u_1^u2UR^JB(|8Z_mIj}Wu|?p5x>F z)X#oS9-37P>N2MkPjrWjbYVc0CrIx*Gl?S|CXG&-OOeygN{4Qbe2Caf1V(&B`|+~? zRtIs&PvCz4VZR=ago#j@-}l07Giiqwm>Os#+Y6;Sk{c>(9j{2^j?k=FfQbpq#Ujq- zE-M0{6|ztkWI=YSE1n&hFV`Gp_20amBW?PrY2PAi;`4VcL)r^7pk*G@KUXBPxwdD) zon>P@OR^sC?M>(MZzgSyj>o|$gx(;9S-?WU7rH=-yd*`8n12IZVhT(ca%7(X3pV|P z9w1T$A|;F;*J-IjB(`t{h`Bp%9n+NTunNv5w?XbZx9OPVPg{k-KA&8pJDJWcJEe9c z&}NmYtqt~cRH-1PDbb5~6BbDAGPRpA=Ial`@g5YGG3lfqzPV79TQdZIzOGN=UCi;) z003-y9NHx6Y}=knaZK+{*Wn3SP*ix+nFQr2h7c{-TezV8%Iyf@9}}kO3T)P<)03gj z-;uo#yOnQ>_7rlS$6Zu0sQfJ54L+J##>whIaxCkzez*-%DJUL1eI%an=_9X`prlw; z0i;K0xV~x+*H3F7H+1)u!4V)WTiwO3f=E9UWg9P#Uq0QDbYYi*+7I_2rx%8d+mSMv z)UU2+C<~k7K_aph3;Bq~{lN{~Ov^b2(l%9o=&oq=(m2*0AZ9JGhIYzNCFC&TTuxhFt$L#`eu4*j+1R-)JU2Qyp~+g{SUU;)p~E2Z|R8 z4T>reX$V*t(q3oi_>#89EIZ~@Bbe|}B?7vY@Y}kv+nWS7WBg-H&4<|n@wfJuE+&j+ z&70em<)D|{z2MTTeg*SAnhmQiJ$8{?IP&AMkJhBP_I&!FScm2gM) zi+bTiVV2~_5r~nDb#ep&B9TO_C+#f9&oPq3A-*1~Yh&p3CaZP&Id1$h$cn_Z(5V;2 z>AQ;o)?wI1h`Gh1$)|ss?$-?eaMC=!W|e6K7Z6@+jeA=di&W!l*i&dPc~?vm35#d> z!dt*7T-YaHjWEq1{aQ(hQa0U@dP_A& z+rt;u^~1Wbv(R)?*OcuiT%)HbilcLXRCzi&v-WL^%^P+3eNE=g>0c(xW;M@`m1WVx z(B`IAjv`%y$fqGLly;aljeNyp(GDNyqknCu+}4;A`gw^-RIw9i6M^IS0@tv!rYnYB z?;%P}C10mecFOSDG*TUEUn^6M5_zNRnVg!mH2S+Q;l zlC7t4zmEI28rXO%M@v$E)~@#A3|vEpr5ls4yUlPE)m}mggnq_uBWd~cvZ29l<05BE zYId&are_Ihd9olFcFsz0<_-ID0g|~|Qxi1}SK9~!?Wj83x^yk;8e0udj+&;ut=$|| z!cA9{i0nIEnZd>BP)XM~keqOukUEv>ZBZw6ja$z->^QDPyCK{8q}247+BIP8VjS8W zFy>qzFeq7c5?2o$?|V8l+V|aLAo;hCkAAiLaUH#&5CZu3;ot9fnzx*z)X30%Yh+Lb z^rZ>It{j~r`5E-JcKNQctTFHQHE*((w*oV&Pp_hdcDCBTXU9c~^fJZBvaHU7Vxo_M zkEr|sBQ}eV*q;&QE-Xg={>=jYXoskF{@$G)eEshuUfp-WcdxfyZ@d3^3jY6Ai&}CW zCO~y}r^5eSS2>a$I}Y^!Df$Eo?gY;xV;srth`#+Gms*~ziX>4a2qd+`=(@Smj}EVW+BROhJ?> zNiRwF(Y`+4^@EoteakcW{N?1;G|fyVo{SyAk-_-Qy5ZT2HclxGpy<+nG`M-}s$YNp zW0l(P9KZn=80K;N7lyZMJ0Fe|n6M@%0g);5tTPeixll1J;qc6vu`(blFGn2b z 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�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%0Asw^2lXsM+ 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 z℘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

-xp6 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 literal 0 HcmV?d00001 diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index cb7f20121..ef30aee21 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -6,6 +6,7 @@ import time from pathlib import Path import inspect +import logging from aryn_sdk.partition import ( partition_file, @@ -18,6 +19,7 @@ from requests.exceptions import HTTPError RESOURCE_DIR = Path(__file__).parent / "resources" +ASYNC_TIMEOUT = 60 * 5 # 5 minutes in seconds # Unit tests @@ -268,9 +270,9 @@ def test_partition_file_async(): start = time.time() actual_result = partition_file_result_async(job_id) - while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < 60 * 5: + while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: actual_result = partition_file_result_async(job_id) - time.sleep(5) + time.sleep(1) assert actual_result.status == JobStatus.DONE with open(RESOURCE_DIR / "json" / "3m_output.json", "rb") as f: @@ -285,10 +287,32 @@ def test_async_partition_with_unsupported_file_format(): start = time.time() actual_result = partition_file_result_async(job_id) - while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < 60 * 5: + while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: actual_result = partition_file_result_async(job_id) time.sleep(5) assert actual_result.status == JobStatus.DONE assert actual_result.result is not None assert actual_result.result["status_code"] == 500 assert actual_result.result["error"] == "500: Failed to convert file to pdf" + + +def test_multiple_partition_file_async(): + num_jobs = 4 + job_ids = [] + + for i in range(num_jobs): + logging.info(f"Submitting job {i + 1}/{num_jobs}") + job_id = partition_file_submit_async(RESOURCE_DIR / "pdfs" / "FR-2002-05-03-TRUNCATED-40.pdf")["job_id"] + logging.info(f"\tJob ID: {job_id}") + job_ids.append(job_id) + + for i, job_id in enumerate(job_ids): + logging.info(f"Checking job ({job_id}) {i + 1}/{num_jobs}") + start = time.time() + actual_result = partition_file_result_async(job_id) + while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: + actual_result = partition_file_result_async(job_id) + time.sleep(1) + logging.info(f"\tPolling Job {job_id} ({i + 1}/{num_jobs})") + assert actual_result.status == JobStatus.DONE + assert len(actual_result.result["elements"]) > 1000 From fc4e95a8a9bafb4be82899a0921c9da29c9b63cc Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 13:59:34 -0800 Subject: [PATCH 32/58] Add cancel API, cancel test, and reduce wait between polls in test --- lib/aryn-sdk/README.md | 16 +++++- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 2 + lib/aryn-sdk/aryn_sdk/partition/partition.py | 54 ++++++++++++++++++++ lib/aryn-sdk/aryn_sdk/test/test_partition.py | 25 +++++++-- 4 files changed, 92 insertions(+), 5 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index 28c264964..fe97c0ca9 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -142,4 +142,18 @@ for i, job_id in job_ids.items(): time.sleep(5) result = partition_file_result_async(job_id) results[i] = result -``` \ No newline at end of file +``` + +#### Cancelling an async job + +```python +from aryn_sdk.partition import partition_file_submit_async, cancel_async_partition_job + job_id = partition_file_submit_async( + "path/to/file.pdf", + use_ocr=True, + extract_table_structure=True, + extract_images=True, + )["job_id"] + + cancel_async_partition_job(job_id) +``` diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index deb75e7ff..26ac11f33 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -2,6 +2,7 @@ partition_file, partition_file_submit_async, partition_file_result_async, + cancel_async_partition_job, tables_to_pandas, table_elem_to_dataframe, convert_image_element, @@ -20,4 +21,5 @@ "partition_file_submit_async", "partition_file_result_async", "JobStatus", + "cancel_async_partition_job", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 5b66b3851..5f4c60d5e 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -429,6 +429,60 @@ def partition_file_result_async( return JobResult(status=JobStatus.ERROR, status_code=response.status_code, result=None) +def cancel_async_partition_job( + job_id: str, + aryn_async_url: str = f"{ARYN_DOCPARSE_URL.split('/v1/',1)[0]}/v1/async/cancel", + aryn_api_key: Optional[str] = None, + aryn_config: Optional[ArynConfig] = None, + ssl_verify: bool = True, +) -> bool: + """ + Cancel an asynchronous partitioning job by job_id. Meant to be used with `partition_file_submit_async`. + + Returns: + A bool indicating whether the job was successfully cancelled by this request. + + Example: + .. code-block:: python + + from aryn_sdk.partition import partition_file_submit_async, cancel_async_partition_job + job_id = partition_file_submit_async( + "path/to/file.pdf", + use_ocr=True, + extract_table_structure=True, + extract_images=True, + )["job_id"] + + cancel_async_partition_job(job_id) + """ + if aryn_api_key is not None: + if aryn_config is not None: + _logger.warning("Both aryn_api_key and aryn_config were provided. Using aryn_api_key") + aryn_config = ArynConfig(aryn_api_key=aryn_api_key) + if aryn_config is None: + aryn_config = ArynConfig() + + # Workaround for vcr. See https://github.com/aryn-ai/sycamore/issues/958 + stream = True + if "vcr" in sys.modules: + ul3 = sys.modules.get("urllib3") + if ul3: + # Look for tell-tale patched method... + mod = ul3.connectionpool.is_connection_dropped.__module__ + if "mock" in mod: + stream = False + + specific_job_url = f"{aryn_async_url}/{job_id}" + http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} + response = requests.post(specific_job_url, headers=http_header, stream=stream, verify=ssl_verify) + if response.status_code == 200: + return True + elif response.status_code == 404: + return False + else: + raise Exception("Unexpected response code.") + + # Heavily adapted from lib/sycamore/data/table.py::Table.to_csv() def table_elem_to_dataframe(elem: dict) -> Optional[pd.DataFrame]: """ diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index ef30aee21..4b789b4ff 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -12,6 +12,7 @@ partition_file, partition_file_submit_async, partition_file_result_async, + cancel_async_partition_job, PartitionError, JobStatus, ) @@ -133,12 +134,10 @@ def test_partition_with_unsupported_file_format(): def test_partition_it_zero_page(): - with pytest.raises(PartitionError) as einfo: with open(RESOURCE_DIR / "pdfs" / "SPsort.pdf", "rb") as f: partition_file(f, selected_pages=[0]) - - assert "Invalid page number (0)" in str(einfo.value) + assert "selected_pages must not have empty or zero terms" in str(einfo.value) def test_partition_it_no_api_key(): @@ -289,7 +288,7 @@ def test_async_partition_with_unsupported_file_format(): actual_result = partition_file_result_async(job_id) while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: actual_result = partition_file_result_async(job_id) - time.sleep(5) + time.sleep(1) assert actual_result.status == JobStatus.DONE assert actual_result.result is not None assert actual_result.result["status_code"] == 500 @@ -316,3 +315,21 @@ def test_multiple_partition_file_async(): logging.info(f"\tPolling Job {job_id} ({i + 1}/{num_jobs})") assert actual_result.status == JobStatus.DONE assert len(actual_result.result["elements"]) > 1000 + + +def test_cancel_async_partition_job(): + with open(RESOURCE_DIR / "pdfs" / "FR-2002-05-03-TRUNCATED-40.pdf", "rb") as f: + job_id = partition_file_submit_async(f)["job_id"] + + before_cancel_result = partition_file_result_async(job_id) + assert before_cancel_result.status == JobStatus.IN_PROGRESS + assert cancel_async_partition_job(job_id) + + # Cancellation is not reflected in the result immediately + for _ in range(10): + time.sleep(0.1) + after_cancel_result = partition_file_result_async(job_id) + if after_cancel_result.status == JobStatus.NO_SUCH_JOB: + break + assert after_cancel_result.status == JobStatus.IN_PROGRESS + assert after_cancel_result.status == JobStatus.NO_SUCH_JOB From df9d70f43120fb7f7beeef1ca2a2a77a50900865 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 14:30:20 -0800 Subject: [PATCH 33/58] Add support for webhooks in async requests --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 93 +++++++++++++++----- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 15 +++- 2 files changed, 84 insertions(+), 24 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 5f4c60d5e..d531e17e9 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -124,18 +124,53 @@ def partition_file( ) elements = data['elements'] """ + return _inner_partition_file( + file=file, + aryn_api_key=aryn_api_key, + aryn_config=aryn_config, + threshold=threshold, + use_ocr=use_ocr, + ocr_images=ocr_images, + extract_table_structure=extract_table_structure, + table_extraction_options=table_extraction_options, + extract_images=extract_images, + selected_pages=selected_pages, + chunking_options=chunking_options, + aps_url=aps_url, + docparse_url=docparse_url, + ssl_verify=ssl_verify, + output_format=output_format, + output_label_options=output_label_options, + ) + + +def _inner_partition_file( + file: Union[BinaryIO, str, PathLike], + aryn_api_key: Optional[str] = None, + aryn_config: Optional[ArynConfig] = None, + threshold: Optional[Union[float, Literal["auto"]]] = None, + use_ocr: bool = False, + ocr_images: bool = False, + extract_table_structure: bool = False, + table_extraction_options: dict[str, Any] = {}, + extract_images: bool = False, + selected_pages: Optional[list[Union[list[int], int]]] = None, + chunking_options: Optional[dict[str, Any]] = None, + aps_url: Optional[str] = None, # deprecated in favor of docparse_url + docparse_url: Optional[str] = None, + ssl_verify: bool = True, + output_format: Optional[str] = None, + output_label_options: dict[str, Any] = {}, + _webhook_dest_url: Optional[str] = None, +): + """Do not call this function. Use partition_file instead.""" # If you hand me a path for the file, read it in instead of trying to send the path if isinstance(file, (str, PathLike)): with open(file, "rb") as f: file = io.BytesIO(f.read()) - if aryn_api_key is not None: - if aryn_config is not None: - _logger.warning("Both aryn_api_key and aryn_config were provided. Using aryn_api_key") - aryn_config = ArynConfig(aryn_api_key=aryn_api_key) - if aryn_config is None: - aryn_config = ArynConfig() + aryn_config = _process_config(aryn_api_key, aryn_config) if aps_url is not None: if docparse_url is not None: @@ -174,8 +209,10 @@ def partition_file( stream = False files: Mapping = {"options": options_str.encode("utf-8"), "pdf": file} - http_header = {"Authorization": "Bearer {}".format(aryn_config.api_key())} - resp = requests.post(docparse_url, files=files, headers=http_header, stream=stream, verify=ssl_verify) + headers = {"Authorization": "Bearer {}".format(aryn_config.api_key())} + if _webhook_dest_url: + headers["X-Aryn-Webhook"] = _webhook_dest_url + resp = requests.post(docparse_url, files=files, headers=headers, stream=stream, verify=ssl_verify) if resp.status_code not in (200, 202): raise requests.exceptions.HTTPError( @@ -226,6 +263,16 @@ def partition_file( return data +def _process_config(aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None) -> ArynConfig: + if aryn_api_key is not None: + if aryn_config is not None: + _logger.warning("Both aryn_api_key and aryn_config were provided. Using aryn_api_key") + aryn_config = ArynConfig(aryn_api_key=aryn_api_key) + if aryn_config is None: + aryn_config = ArynConfig() + return aryn_config + + def _json_options( threshold: Optional[Union[float, Literal["auto"]]] = None, use_ocr: bool = False, @@ -266,11 +313,20 @@ def _json_options( return json.dumps(options) -def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) -> dict: +def partition_file_submit_async( + *args, webhook_url: Optional[str] = None, force_async_url: bool = False, **kwargs +) -> dict: """ Submits a file to be partitioned asynchronously. Takes same arguments as partition_file. Automatically changes the endpoint to the async endpoint, unless force_async_url is set to True. + Args: + Includes All Arguments `partition_file` accepts + ... + webhook_url: A URL to send a POST request to when the job is done. The resulting POST request will have a + body like: {"done": [{"job_id": "aryn:j-47gpd3604e5tz79z1jro5fc"}]} + force_async_url: If set to True, then this function will not change the endpoint url automatically + Returns: A dictionary containing "job_id" which can be used with the `partition_file_result_async` function to get the results. @@ -330,6 +386,9 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) args_list = list(args) + if webhook_url: + kwargs["_webhook_dest_url"] = webhook_url + if not force_async_url: # If force_async_url is set to True, then this function will not change the endpoint # Check if docparse_url was provided as a positional argument. If it was, then this checks to make sure that # docparse_url is set to the async endpoint. If docparse_url is specified and it's not set to the async @@ -360,7 +419,7 @@ def partition_file_submit_async(*args, force_async_url: bool = False, **kwargs) kwargs["aps_url"] = aps_url.replace("/v1/", "/v1/async/submit/") else: kwargs["docparse_url"] = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") - return partition_file(*args_list, **kwargs) + return _inner_partition_file(*args_list, **kwargs) class JobStatus(str, Enum): @@ -398,12 +457,7 @@ def partition_file_result_async( See the examples in the docstring for `partition_file_submit_async` for a full example of how to use this function. """ - if aryn_api_key is not None: - if aryn_config is not None: - _logger.warning("Both aryn_api_key and aryn_config were provided. Using aryn_api_key") - aryn_config = ArynConfig(aryn_api_key=aryn_api_key) - if aryn_config is None: - aryn_config = ArynConfig() + aryn_config = _process_config(aryn_api_key, aryn_config) # Workaround for vcr. See https://github.com/aryn-ai/sycamore/issues/958 stream = True @@ -455,12 +509,7 @@ def cancel_async_partition_job( cancel_async_partition_job(job_id) """ - if aryn_api_key is not None: - if aryn_config is not None: - _logger.warning("Both aryn_api_key and aryn_config were provided. Using aryn_api_key") - aryn_config = ArynConfig(aryn_api_key=aryn_api_key) - if aryn_config is None: - aryn_config = ArynConfig() + aryn_config = _process_config(aryn_api_key, aryn_config) # Workaround for vcr. See https://github.com/aryn-ai/sycamore/issues/958 stream = True diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 4b789b4ff..19094dd23 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -229,7 +229,7 @@ def check_standard_url( assert url == standard_async_url mocker.patch("inspect.getfullargspec").return_value = inspect.getfullargspec(partition_file) - mocker.patch("aryn_sdk.partition.partition.partition_file", side_effect=check_standard_url) + mocker.patch("aryn_sdk.partition.partition._inner_partition_file", side_effect=check_standard_url) partition_file_submit_async("") call_partition_file(ARYN_DOCPARSE_URL) call_partition_file(standard_async_url) @@ -258,7 +258,7 @@ def check_nonstandard_url( url = docparse_url or aps_url assert url == nonstandard_async_url_example - mocker.patch("aryn_sdk.partition.partition.partition_file", side_effect=check_nonstandard_url) + mocker.patch("aryn_sdk.partition.partition._inner_partition_file", side_effect=check_nonstandard_url) call_partition_file(nonstandard_url_example) call_partition_file(nonstandard_async_url_example) @@ -333,3 +333,14 @@ def test_cancel_async_partition_job(): break assert after_cancel_result.status == JobStatus.IN_PROGRESS assert after_cancel_result.status == JobStatus.NO_SUCH_JOB + + +def test_smoke_webhook(mocker): + data = b'{"job_id": "1234"}' + + mocked_response = mocker.Mock() + mocked_response.status_code = 202 + mocked_response.iter_content.return_value = data.split(sep=b"\n") + + mocker.patch("requests.post").return_value = mocked_response + partition_file_submit_async(RESOURCE_DIR / "pdfs" / "3m_table.pdf", webhook_url="TEST") From a9d8749ebeaa885a3570dab19352fcdeac1ea0e9 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 14:53:54 -0800 Subject: [PATCH 34/58] Add webhook instructions to README --- lib/aryn-sdk/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index fe97c0ca9..020e084ec 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -120,6 +120,17 @@ while result.status == JobStatus.IN_PROGRESS: result = partition_file_result_async(job_id) ``` +Optionally, you can also set a webhook for Aryn to call when your job is completed: + +```python +partition_file_submit_async("path/to/my/file.docx", webhook_url="https://example.com/alert") +``` + +Aryn will POST a request containing a body like the below: +```json +{"done": [{"job_id": "aryn:j-47gpd3604e5tz79z1jro5fc"}]} +``` + #### Multi-Job Example ```python From 9b2cbd53f4ab3fa4e107dc89912e66b26e8a8f1f Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 15:13:21 -0800 Subject: [PATCH 35/58] Fix examples --- lib/aryn-sdk/README.md | 4 ++-- lib/aryn-sdk/aryn_sdk/partition/partition.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index 020e084ec..aac9e00d4 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -102,7 +102,7 @@ png_str = convert_image_element(image_elts[2], format="PNG", b64encode=True) #### Single Job Example ```python import time -from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async +from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus with open("my-favorite-pdf.pdf", "rb") as f: job = partition_file_submit_async( @@ -136,7 +136,7 @@ Aryn will POST a request containing a body like the below: ```python import logging import time -from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, PartitionError +from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index d531e17e9..933b63169 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -335,7 +335,7 @@ def partition_file_submit_async( .. code-block:: python import time - from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async + from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus with open("my-favorite-pdf.pdf", "rb") as f: job = partition_file_submit_async( @@ -357,7 +357,7 @@ def partition_file_submit_async( import logging import time - from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, PartitionError + from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} From 1186025740ea0763d8cb289275acda9c4a69307a Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 15:57:16 -0800 Subject: [PATCH 36/58] Change TOKEN to API-KEY in example --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 933b63169..d04192469 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -622,7 +622,7 @@ def tables_to_pandas(data: dict) -> list[tuple[dict, Optional[pd.DataFrame]]]: with open("my-favorite-pdf.pdf", "rb") as f: data = partition_file( f, - aryn_api_key="MY-ARYN-TOKEN", + aryn_api_key="MY-ARYN-API-KEY", use_ocr=True, extract_table_structure=True, extract_images=True From 24d43eb574d18863574a91effa75e04c21f8fbd4 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 17:19:47 -0800 Subject: [PATCH 37/58] Change `job` to `response` in examples, fix multi-job examples --- lib/aryn-sdk/README.md | 6 +++--- lib/aryn-sdk/aryn_sdk/partition/partition.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index aac9e00d4..7bfe0da16 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -105,13 +105,13 @@ import time from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus with open("my-favorite-pdf.pdf", "rb") as f: - job = partition_file_submit_async( + response = partition_file_submit_async( f, use_ocr=True, extract_table_structure=True, ) -job_id = job["job_id"] +job_id = response["job_id"] # Poll for the results result = partition_file_result_async(job_id) @@ -142,7 +142,7 @@ files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} for i, f in enumerate(files): try: - job_ids[i] = partition_file_submit_async(f)) + job_ids[i] = partition_file_submit_async(f)["job_id"] except Exception as e: logging.warning(f"Failed to submit {f}: {e}") diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index d04192469..6bf35d7f5 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -338,13 +338,13 @@ def partition_file_submit_async( from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus with open("my-favorite-pdf.pdf", "rb") as f: - job = partition_file_submit_async( + response = partition_file_submit_async( f, use_ocr=True, extract_table_structure=True, ) - job_id = job["job_id"] + job_id = response["job_id"] # Poll for the results result = partition_file_result_async(job_id) @@ -363,7 +363,7 @@ def partition_file_submit_async( job_ids = {} for i, f in enumerate(files): try: - job_ids[i] = partition_file_submit_async(f)) + job_ids[i] = partition_file_submit_async(f)["job_id"] except Exception as e: logging.warning(f"Failed to submit {f}: {e}") From feca8d5bc17c8b6c0af15366b9d51dab9b6f3520 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 17:27:48 -0800 Subject: [PATCH 38/58] Improve single async job example --- lib/aryn-sdk/README.md | 7 ++++--- lib/aryn-sdk/aryn_sdk/partition/partition.py | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index 7bfe0da16..e882cd8c6 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -114,10 +114,11 @@ with open("my-favorite-pdf.pdf", "rb") as f: job_id = response["job_id"] # Poll for the results -result = partition_file_result_async(job_id) -while result.status == JobStatus.IN_PROGRESS: - time.sleep(5) +while True: result = partition_file_result_async(job_id) + if result.status != JobStatus.IN_PROGRESS: + break + time.sleep(5) ``` Optionally, you can also set a webhook for Aryn to call when your job is completed: diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 6bf35d7f5..36022a1f4 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -347,10 +347,11 @@ def partition_file_submit_async( job_id = response["job_id"] # Poll for the results - result = partition_file_result_async(job_id) - while result.status == JobStatus.IN_PROGRESS: - time.sleep(5) + while True: result = partition_file_result_async(job_id) + if result.status != JobStatus.IN_PROGRESS: + break + time.sleep(5) Multi-Job Example: .. code-block:: python From 28141ebc777a73988d02698ad447b10686b7c958 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 17:56:31 -0800 Subject: [PATCH 39/58] Make `test_smoke_webhook` more strict --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 19094dd23..6a2cd52db 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -338,9 +338,17 @@ def test_cancel_async_partition_job(): def test_smoke_webhook(mocker): data = b'{"job_id": "1234"}' + webhook_url = "TEST" + mocked_response = mocker.Mock() mocked_response.status_code = 202 mocked_response.iter_content.return_value = data.split(sep=b"\n") - mocker.patch("requests.post").return_value = mocked_response - partition_file_submit_async(RESOURCE_DIR / "pdfs" / "3m_table.pdf", webhook_url="TEST") + def check_webhook(*args, headers, **kwargs): + assert "X-Aryn-Webhook" in headers + assert headers.get("X-Aryn-Webhook") == webhook_url + return mocked_response + + fake_post = mocker.patch("requests.post", side_effect=check_webhook) + partition_file_submit_async(RESOURCE_DIR / "pdfs" / "3m_table.pdf", webhook_url=webhook_url) + fake_post.assert_called() From da8259c3b02a230ef2e7b70ddd98015d276dc582 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 18:00:08 -0800 Subject: [PATCH 40/58] Make two-call loop into one-call loop in `test_partition_file_async` --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 6a2cd52db..1f642185d 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -268,9 +268,10 @@ def test_partition_file_async(): job_id = partition_file_submit_async(f)["job_id"] start = time.time() - actual_result = partition_file_result_async(job_id) - while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: + while True: actual_result = partition_file_result_async(job_id) + if actual_result.status != JobStatus.IN_PROGRESS or time.time() - start >= ASYNC_TIMEOUT: + break time.sleep(1) assert actual_result.status == JobStatus.DONE From aa56a33c19415dc790d56bd7acdc3e8725e05f91 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 18:19:18 -0800 Subject: [PATCH 41/58] Remove call to `split` --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 1f642185d..39e254eb6 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -186,7 +186,7 @@ def test_partition_file_submit_async(mocker): mocked_response = mocker.Mock() mocked_response.status_code = 202 - mocked_response.iter_content.return_value = data.split(sep=b"\n") + mocked_response.iter_content.return_value = (data,) mocker.patch("requests.post").return_value = mocked_response From b9f7b0ff297f5251d15d7562a1ca8c632e36fb0d Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 18:20:41 -0800 Subject: [PATCH 42/58] Remove unneeded parameter from `.decode` --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 39e254eb6..4b2cec3bd 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -182,7 +182,7 @@ def test_invalid_job_id(): def test_partition_file_submit_async(mocker): data = b'{"job_id": "1234"}' - expected_response = json.loads(data.decode("utf-8")) + expected_response = json.loads(data.decode()) mocked_response = mocker.Mock() mocked_response.status_code = 202 From 2c435d768fd454af9a564d7a6df34bcc9c204ed1 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 18:45:28 -0800 Subject: [PATCH 43/58] move stream setting logic into funciton --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 49 +++++++------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 36022a1f4..a31af1914 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -198,21 +198,11 @@ def _inner_partition_file( _logger.debug(f"{options_str}") - # Workaround for vcr. See https://github.com/aryn-ai/sycamore/issues/958 - stream = True - if "vcr" in sys.modules: - ul3 = sys.modules.get("urllib3") - if ul3: - # Look for tell-tale patched method... - mod = ul3.connectionpool.is_connection_dropped.__module__ - if "mock" in mod: - stream = False - files: Mapping = {"options": options_str.encode("utf-8"), "pdf": file} headers = {"Authorization": "Bearer {}".format(aryn_config.api_key())} if _webhook_dest_url: headers["X-Aryn-Webhook"] = _webhook_dest_url - resp = requests.post(docparse_url, files=files, headers=headers, stream=stream, verify=ssl_verify) + resp = requests.post(docparse_url, files=files, headers=headers, stream=_set_stream(), verify=ssl_verify) if resp.status_code not in (200, 202): raise requests.exceptions.HTTPError( @@ -273,6 +263,19 @@ def _process_config(aryn_api_key: Optional[str] = None, aryn_config: Optional[Ar return aryn_config +def _set_stream() -> bool: + # Workaround for vcr. See https://github.com/aryn-ai/sycamore/issues/958 + stream = True + if "vcr" in sys.modules: + ul3 = sys.modules.get("urllib3") + if ul3: + # Look for tell-tale patched method... + mod = ul3.connectionpool.is_connection_dropped.__module__ + if "mock" in mod: + stream = False + return stream + + def _json_options( threshold: Optional[Union[float, Literal["auto"]]] = None, use_ocr: bool = False, @@ -460,19 +463,9 @@ def partition_file_result_async( """ aryn_config = _process_config(aryn_api_key, aryn_config) - # Workaround for vcr. See https://github.com/aryn-ai/sycamore/issues/958 - stream = True - if "vcr" in sys.modules: - ul3 = sys.modules.get("urllib3") - if ul3: - # Look for tell-tale patched method... - mod = ul3.connectionpool.is_connection_dropped.__module__ - if "mock" in mod: - stream = False - specific_job_url = f"{aryn_async_url}/{job_id}" http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} - response = requests.get(specific_job_url, headers=http_header, stream=stream, verify=ssl_verify) + response = requests.get(specific_job_url, headers=http_header, stream=_set_stream(), verify=ssl_verify) if response.status_code == 200: return JobResult(status=JobStatus.DONE, result=response.json(), status_code=response.status_code) @@ -512,19 +505,9 @@ def cancel_async_partition_job( """ aryn_config = _process_config(aryn_api_key, aryn_config) - # Workaround for vcr. See https://github.com/aryn-ai/sycamore/issues/958 - stream = True - if "vcr" in sys.modules: - ul3 = sys.modules.get("urllib3") - if ul3: - # Look for tell-tale patched method... - mod = ul3.connectionpool.is_connection_dropped.__module__ - if "mock" in mod: - stream = False - specific_job_url = f"{aryn_async_url}/{job_id}" http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} - response = requests.post(specific_job_url, headers=http_header, stream=stream, verify=ssl_verify) + response = requests.post(specific_job_url, headers=http_header, stream=_set_stream(), verify=ssl_verify) if response.status_code == 200: return True elif response.status_code == 404: From 011527e21e0a37a689b02db7230c79a2f7f8c9f8 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 19:03:25 -0800 Subject: [PATCH 44/58] Rename async functions to have standard form --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 12 ++-- lib/aryn-sdk/aryn_sdk/partition/partition.py | 43 +++++++-------- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 58 ++++++++++---------- 3 files changed, 56 insertions(+), 57 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index 26ac11f33..5b23c023d 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -1,8 +1,8 @@ from .partition import ( partition_file, - partition_file_submit_async, - partition_file_result_async, - cancel_async_partition_job, + partition_file_async_submit, + partition_file_async_result, + partition_file_async_cancel, tables_to_pandas, table_elem_to_dataframe, convert_image_element, @@ -18,8 +18,8 @@ "draw_with_boxes", "convert_image_element", "PartitionError", - "partition_file_submit_async", - "partition_file_result_async", + "partition_file_async_submit", + "partition_file_async_result", "JobStatus", - "cancel_async_partition_job", + "partition_file_async_cancel", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index a31af1914..106b3a7e2 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -124,7 +124,7 @@ def partition_file( ) elements = data['elements'] """ - return _inner_partition_file( + return _partition_file_inner( file=file, aryn_api_key=aryn_api_key, aryn_config=aryn_config, @@ -144,7 +144,7 @@ def partition_file( ) -def _inner_partition_file( +def _partition_file_inner( file: Union[BinaryIO, str, PathLike], aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, @@ -316,7 +316,7 @@ def _json_options( return json.dumps(options) -def partition_file_submit_async( +def partition_file_async_submit( *args, webhook_url: Optional[str] = None, force_async_url: bool = False, **kwargs ) -> dict: """ @@ -331,17 +331,17 @@ def partition_file_submit_async( force_async_url: If set to True, then this function will not change the endpoint url automatically Returns: - A dictionary containing "job_id" which can be used with the `partition_file_result_async` + A dictionary containing "job_id" which can be used with the `partition_file_async_result` function to get the results. Single Job Example: .. code-block:: python import time - from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus + from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result, JobStatus with open("my-favorite-pdf.pdf", "rb") as f: - response = partition_file_submit_async( + response = partition_file_async_submit( f, use_ocr=True, extract_table_structure=True, @@ -351,7 +351,7 @@ def partition_file_submit_async( # Poll for the results while True: - result = partition_file_result_async(job_id) + result = partition_file_async_result(job_id) if result.status != JobStatus.IN_PROGRESS: break time.sleep(5) @@ -361,22 +361,22 @@ def partition_file_submit_async( import logging import time - from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus + from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result, JobStatus files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} for i, f in enumerate(files): try: - job_ids[i] = partition_file_submit_async(f)["job_id"] + job_ids[i] = partition_file_async_submit(f)["job_id"] except Exception as e: logging.warning(f"Failed to submit {f}: {e}") results = {} for i, job_id in job_ids.items(): - result = partition_file_result_async(job_id) + result = partition_file_async_result(job_id) while result.status == JobStatus.IN_PROGRESS: time.sleep(5) - result = partition_file_result_async(job_id) + result = partition_file_async_result(job_id) results[i] = result """ @@ -386,7 +386,7 @@ def partition_file_submit_async( aps_url_position = ordered_partition_file_parameter_names.index("aps_url") assert ( aps_url_position < docparse_url_position - ), "partition_file_submit_async assumes that aps_url comes before docparse_url" + ), "partition_file_async_submit assumes that aps_url comes before docparse_url" args_list = list(args) @@ -423,7 +423,7 @@ def partition_file_submit_async( kwargs["aps_url"] = aps_url.replace("/v1/", "/v1/async/submit/") else: kwargs["docparse_url"] = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") - return _inner_partition_file(*args_list, **kwargs) + return _partition_file_inner(*args_list, **kwargs) class JobStatus(str, Enum): @@ -439,7 +439,7 @@ class JobResult(BaseModel): result: Optional[dict] -def partition_file_result_async( +def partition_file_async_result( job_id: str, aryn_async_url: str = f"{ARYN_DOCPARSE_URL.split('/v1/',1)[0]}/v1/async/result", aryn_api_key: Optional[str] = None, @@ -447,7 +447,7 @@ def partition_file_result_async( ssl_verify: bool = True, ) -> JobResult: """ - Get the results of an asynchronous partitioning job by job_id. Meant to be used with `partition_file_submit_async`. + Get the results of an asynchronous partitioning job by job_id. Meant to be used with `partition_file_async_submit`. Returns: A JobResult object containing "status", "status_code", and also "result" which is non-None when "status" is @@ -458,7 +458,7 @@ def partition_file_result_async( had the partitioning been done synchronously. Example: - See the examples in the docstring for `partition_file_submit_async` for a full example of how to use this + See the examples in the docstring for `partition_file_async_submit` for a full example of how to use this function. """ aryn_config = _process_config(aryn_api_key, aryn_config) @@ -476,8 +476,7 @@ def partition_file_result_async( else: return JobResult(status=JobStatus.ERROR, status_code=response.status_code, result=None) - -def cancel_async_partition_job( +def partition_file_async_cancel( job_id: str, aryn_async_url: str = f"{ARYN_DOCPARSE_URL.split('/v1/',1)[0]}/v1/async/cancel", aryn_api_key: Optional[str] = None, @@ -485,7 +484,7 @@ def cancel_async_partition_job( ssl_verify: bool = True, ) -> bool: """ - Cancel an asynchronous partitioning job by job_id. Meant to be used with `partition_file_submit_async`. + Cancel an asynchronous partitioning job by job_id. Meant to be used with `partition_file_async_submit`. Returns: A bool indicating whether the job was successfully cancelled by this request. @@ -493,15 +492,15 @@ def cancel_async_partition_job( Example: .. code-block:: python - from aryn_sdk.partition import partition_file_submit_async, cancel_async_partition_job - job_id = partition_file_submit_async( + from aryn_sdk.partition import partition_file_async_submit, partition_file_async_cancel + job_id = partition_file_async_submit( "path/to/file.pdf", use_ocr=True, extract_table_structure=True, extract_images=True, )["job_id"] - cancel_async_partition_job(job_id) + partition_file_async_cancel(job_id) """ aryn_config = _process_config(aryn_api_key, aryn_config) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 4b2cec3bd..cc8422713 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -10,9 +10,9 @@ from aryn_sdk.partition import ( partition_file, - partition_file_submit_async, - partition_file_result_async, - cancel_async_partition_job, + partition_file_async_submit, + partition_file_async_result, + partition_file_async_cancel, PartitionError, JobStatus, ) @@ -176,11 +176,11 @@ def test_convert_img(): def test_invalid_job_id(): - response = partition_file_result_async("INVALID_JOB_ID") + response = partition_file_async_result("INVALID_JOB_ID") assert response.status == JobStatus.NO_SUCH_JOB -def test_partition_file_submit_async(mocker): +def test_partition_file_async_submit(mocker): data = b'{"job_id": "1234"}' expected_response = json.loads(data.decode()) @@ -191,19 +191,19 @@ def test_partition_file_submit_async(mocker): mocker.patch("requests.post").return_value = mocked_response with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: - response = partition_file_submit_async(f) + response = partition_file_async_submit(f) assert response == expected_response def test_partiton_file_async_url_forwarding(mocker): def call_partition_file(base_url: str): - partition_file_submit_async("", docparse_url=base_url) - partition_file_submit_async("", aps_url=base_url) - partition_file_submit_async(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, base_url) - partition_file_submit_async(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wrong", base_url) - partition_file_submit_async(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wrong", docparse_url=base_url) - partition_file_submit_async("", aps_url=base_url, docparse_url=base_url) + partition_file_async_submit("", docparse_url=base_url) + partition_file_async_submit("", aps_url=base_url) + partition_file_async_submit(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, base_url) + partition_file_async_submit(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wrong", base_url) + partition_file_async_submit(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wrong", docparse_url=base_url) + partition_file_async_submit("", aps_url=base_url, docparse_url=base_url) standard_async_url = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") @@ -229,8 +229,8 @@ def check_standard_url( assert url == standard_async_url mocker.patch("inspect.getfullargspec").return_value = inspect.getfullargspec(partition_file) - mocker.patch("aryn_sdk.partition.partition._inner_partition_file", side_effect=check_standard_url) - partition_file_submit_async("") + mocker.patch("aryn_sdk.partition.partition._partition_file_inner", side_effect=check_standard_url) + partition_file_async_submit("") call_partition_file(ARYN_DOCPARSE_URL) call_partition_file(standard_async_url) @@ -258,18 +258,18 @@ def check_nonstandard_url( url = docparse_url or aps_url assert url == nonstandard_async_url_example - mocker.patch("aryn_sdk.partition.partition._inner_partition_file", side_effect=check_nonstandard_url) + mocker.patch("aryn_sdk.partition.partition._partition_file_inner", side_effect=check_nonstandard_url) call_partition_file(nonstandard_url_example) call_partition_file(nonstandard_async_url_example) def test_partition_file_async(): with open(RESOURCE_DIR / "pdfs" / "3m_table.pdf", "rb") as f: - job_id = partition_file_submit_async(f)["job_id"] + job_id = partition_file_async_submit(f)["job_id"] start = time.time() while True: - actual_result = partition_file_result_async(job_id) + actual_result = partition_file_async_result(job_id) if actual_result.status != JobStatus.IN_PROGRESS or time.time() - start >= ASYNC_TIMEOUT: break time.sleep(1) @@ -283,12 +283,12 @@ def test_partition_file_async(): def test_async_partition_with_unsupported_file_format(): with open(RESOURCE_DIR / "image" / "unsupported-format-test-document-image.heic", "rb") as f: - job_id = partition_file_submit_async(f)["job_id"] + job_id = partition_file_async_submit(f)["job_id"] start = time.time() - actual_result = partition_file_result_async(job_id) + actual_result = partition_file_async_result(job_id) while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: - actual_result = partition_file_result_async(job_id) + actual_result = partition_file_async_result(job_id) time.sleep(1) assert actual_result.status == JobStatus.DONE assert actual_result.result is not None @@ -302,34 +302,34 @@ def test_multiple_partition_file_async(): for i in range(num_jobs): logging.info(f"Submitting job {i + 1}/{num_jobs}") - job_id = partition_file_submit_async(RESOURCE_DIR / "pdfs" / "FR-2002-05-03-TRUNCATED-40.pdf")["job_id"] + job_id = partition_file_async_submit(RESOURCE_DIR / "pdfs" / "FR-2002-05-03-TRUNCATED-40.pdf")["job_id"] logging.info(f"\tJob ID: {job_id}") job_ids.append(job_id) for i, job_id in enumerate(job_ids): logging.info(f"Checking job ({job_id}) {i + 1}/{num_jobs}") start = time.time() - actual_result = partition_file_result_async(job_id) + actual_result = partition_file_async_result(job_id) while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: - actual_result = partition_file_result_async(job_id) + actual_result = partition_file_async_result(job_id) time.sleep(1) logging.info(f"\tPolling Job {job_id} ({i + 1}/{num_jobs})") assert actual_result.status == JobStatus.DONE assert len(actual_result.result["elements"]) > 1000 -def test_cancel_async_partition_job(): +def test_partition_file_async_cancel(): with open(RESOURCE_DIR / "pdfs" / "FR-2002-05-03-TRUNCATED-40.pdf", "rb") as f: - job_id = partition_file_submit_async(f)["job_id"] + job_id = partition_file_async_submit(f)["job_id"] - before_cancel_result = partition_file_result_async(job_id) + before_cancel_result = partition_file_async_result(job_id) assert before_cancel_result.status == JobStatus.IN_PROGRESS - assert cancel_async_partition_job(job_id) + assert partition_file_async_cancel(job_id) # Cancellation is not reflected in the result immediately for _ in range(10): time.sleep(0.1) - after_cancel_result = partition_file_result_async(job_id) + after_cancel_result = partition_file_async_result(job_id) if after_cancel_result.status == JobStatus.NO_SUCH_JOB: break assert after_cancel_result.status == JobStatus.IN_PROGRESS @@ -351,5 +351,5 @@ def check_webhook(*args, headers, **kwargs): return mocked_response fake_post = mocker.patch("requests.post", side_effect=check_webhook) - partition_file_submit_async(RESOURCE_DIR / "pdfs" / "3m_table.pdf", webhook_url=webhook_url) + partition_file_async_submit(RESOURCE_DIR / "pdfs" / "3m_table.pdf", webhook_url=webhook_url) fake_post.assert_called() From b7be7a8018b0b34c9abbf7384693578011226eea Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 19:57:42 -0800 Subject: [PATCH 45/58] Rename `_partition_file_inner`'s `_webhook_dest_url` to just `webhook_url` --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 106b3a7e2..8557d7b06 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -161,7 +161,7 @@ def _partition_file_inner( ssl_verify: bool = True, output_format: Optional[str] = None, output_label_options: dict[str, Any] = {}, - _webhook_dest_url: Optional[str] = None, + webhook_url: Optional[str] = None, ): """Do not call this function. Use partition_file instead.""" @@ -200,8 +200,8 @@ def _partition_file_inner( files: Mapping = {"options": options_str.encode("utf-8"), "pdf": file} headers = {"Authorization": "Bearer {}".format(aryn_config.api_key())} - if _webhook_dest_url: - headers["X-Aryn-Webhook"] = _webhook_dest_url + if webhook_url: + headers["X-Aryn-Webhook"] = webhook_url resp = requests.post(docparse_url, files=files, headers=headers, stream=_set_stream(), verify=ssl_verify) if resp.status_code not in (200, 202): @@ -391,7 +391,7 @@ def partition_file_async_submit( args_list = list(args) if webhook_url: - kwargs["_webhook_dest_url"] = webhook_url + kwargs["webhook_url"] = webhook_url if not force_async_url: # If force_async_url is set to True, then this function will not change the endpoint # Check if docparse_url was provided as a positional argument. If it was, then this checks to make sure that From e16f9261c52dea03974245fe1c8d99778830e50f Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 20:13:11 -0800 Subject: [PATCH 46/58] Fix function names in README, change double-call loop to single-call loop in multi-async call example --- lib/aryn-sdk/README.md | 25 ++++++++++---------- lib/aryn-sdk/aryn_sdk/partition/partition.py | 7 +++--- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index e882cd8c6..e3b6120f9 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -102,10 +102,10 @@ png_str = convert_image_element(image_elts[2], format="PNG", b64encode=True) #### Single Job Example ```python import time -from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus +from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result, JobStatus with open("my-favorite-pdf.pdf", "rb") as f: - response = partition_file_submit_async( + response = partition_file_async_submit( f, use_ocr=True, extract_table_structure=True, @@ -115,7 +115,7 @@ job_id = response["job_id"] # Poll for the results while True: - result = partition_file_result_async(job_id) + result = partition_file_async_result(job_id) if result.status != JobStatus.IN_PROGRESS: break time.sleep(5) @@ -124,7 +124,7 @@ while True: Optionally, you can also set a webhook for Aryn to call when your job is completed: ```python -partition_file_submit_async("path/to/my/file.docx", webhook_url="https://example.com/alert") +partition_file_async_submit("path/to/my/file.docx", webhook_url="https://example.com/alert") ``` Aryn will POST a request containing a body like the below: @@ -137,35 +137,36 @@ Aryn will POST a request containing a body like the below: ```python import logging import time -from aryn_sdk.partition import partition_file_submit_async, partition_file_result_async, JobStatus +from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result, JobStatus files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} for i, f in enumerate(files): try: - job_ids[i] = partition_file_submit_async(f)["job_id"] + job_ids[i] = partition_file_async_submit(f)["job_id"] except Exception as e: logging.warning(f"Failed to submit {f}: {e}") results = {} for i, job_id in job_ids.items(): - result = partition_file_result_async(job_id) - while result.status == JobStatus.IN_PROGRESS: + while True: + result = partition_file_async_result(job_id) + if result.status != JobStatus.In_PROGRESS: + break time.sleep(5) - result = partition_file_result_async(job_id) results[i] = result ``` #### Cancelling an async job ```python -from aryn_sdk.partition import partition_file_submit_async, cancel_async_partition_job - job_id = partition_file_submit_async( +from aryn_sdk.partition import partition_file_async_submit, partition_file_async_cancel + job_id = partition_file_async_submit( "path/to/file.pdf", use_ocr=True, extract_table_structure=True, extract_images=True, )["job_id"] - cancel_async_partition_job(job_id) + partition_file_async_cancel(job_id) ``` diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 8557d7b06..506eb7f12 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -373,10 +373,11 @@ def partition_file_async_submit( results = {} for i, job_id in job_ids.items(): - result = partition_file_async_result(job_id) - while result.status == JobStatus.IN_PROGRESS: - time.sleep(5) + while True: result = partition_file_async_result(job_id) + if result.status != JobStatus.In_PROGRESS: + break + time.sleep(5) results[i] = result """ From e5720333564a4bf3c5002de63eb06558e142c7d4 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 20:15:20 -0800 Subject: [PATCH 47/58] Make return type of `partition_file_async_submit` more strict --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 506eb7f12..8e96f9d92 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -318,7 +318,7 @@ def _json_options( def partition_file_async_submit( *args, webhook_url: Optional[str] = None, force_async_url: bool = False, **kwargs -) -> dict: +) -> dict[str, Any]: """ Submits a file to be partitioned asynchronously. Takes same arguments as partition_file. Automatically changes the endpoint to the async endpoint, unless force_async_url is set to True. From 4fd7721d89db1db19c217ca6709771399ed53036 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Thu, 23 Jan 2025 21:23:51 -0800 Subject: [PATCH 48/58] Remove pydantic, enum --- lib/aryn-sdk/README.md | 8 ++--- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 2 -- lib/aryn-sdk/aryn_sdk/partition/partition.py | 37 +++++++------------- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 35 +++++++++--------- 4 files changed, 33 insertions(+), 49 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index e3b6120f9..cebd26dfa 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -102,7 +102,7 @@ png_str = convert_image_element(image_elts[2], format="PNG", b64encode=True) #### Single Job Example ```python import time -from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result, JobStatus +from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result with open("my-favorite-pdf.pdf", "rb") as f: response = partition_file_async_submit( @@ -116,7 +116,7 @@ job_id = response["job_id"] # Poll for the results while True: result = partition_file_async_result(job_id) - if result.status != JobStatus.IN_PROGRESS: + if result.status != "pending": break time.sleep(5) ``` @@ -137,7 +137,7 @@ Aryn will POST a request containing a body like the below: ```python import logging import time -from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result, JobStatus +from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} @@ -151,7 +151,7 @@ results = {} for i, job_id in job_ids.items(): while True: result = partition_file_async_result(job_id) - if result.status != JobStatus.In_PROGRESS: + if result.status != "pending": break time.sleep(5) results[i] = result diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index 5b23c023d..1f166929c 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -7,7 +7,6 @@ table_elem_to_dataframe, convert_image_element, PartitionError, - JobStatus, ) from .art import draw_with_boxes @@ -20,6 +19,5 @@ "PartitionError", "partition_file_async_submit", "partition_file_async_result", - "JobStatus", "partition_file_async_cancel", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 8e96f9d92..077e3314e 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -3,7 +3,6 @@ from enum import Enum from collections.abc import Mapping from aryn_sdk.config import ArynConfig -from pydantic import BaseModel import requests import sys import json @@ -338,7 +337,7 @@ def partition_file_async_submit( .. code-block:: python import time - from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result, JobStatus + from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result with open("my-favorite-pdf.pdf", "rb") as f: response = partition_file_async_submit( @@ -352,7 +351,7 @@ def partition_file_async_submit( # Poll for the results while True: result = partition_file_async_result(job_id) - if result.status != JobStatus.IN_PROGRESS: + if result.status != "pending": break time.sleep(5) @@ -361,7 +360,7 @@ def partition_file_async_submit( import logging import time - from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result, JobStatus + from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] job_ids = {} @@ -375,7 +374,7 @@ def partition_file_async_submit( for i, job_id in job_ids.items(): while True: result = partition_file_async_result(job_id) - if result.status != JobStatus.In_PROGRESS: + if result.status != "pending": break time.sleep(5) results[i] = result @@ -427,32 +426,19 @@ def partition_file_async_submit( return _partition_file_inner(*args_list, **kwargs) -class JobStatus(str, Enum): - IN_PROGRESS = "in_progress" - DONE = "done" - ERROR = "error" - NO_SUCH_JOB = "no_such_job" - - -class JobResult(BaseModel): - status: JobStatus - status_code: int - result: Optional[dict] - - def partition_file_async_result( job_id: str, aryn_async_url: str = f"{ARYN_DOCPARSE_URL.split('/v1/',1)[0]}/v1/async/result", aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, ssl_verify: bool = True, -) -> JobResult: +) -> dict: """ Get the results of an asynchronous partitioning job by job_id. Meant to be used with `partition_file_async_submit`. Returns: - A JobResult object containing "status", "status_code", and also "result" which is non-None when "status" is - JobStatus.DONE. + A dict containing "status", "status_code", and also "result" which is "status" is "done". "status" can be + "done", "pending", "error", or "no_such_job". Unlike `partition_file`, this function does not raise an Exception if the partitioning failed. Note the "result" attribute of the returned JobResult contains what would have been the return value of `partition_file` @@ -469,13 +455,14 @@ def partition_file_async_result( response = requests.get(specific_job_url, headers=http_header, stream=_set_stream(), verify=ssl_verify) if response.status_code == 200: - return JobResult(status=JobStatus.DONE, result=response.json(), status_code=response.status_code) + return {"status": "done", "status_code": response.status_code, "result": response.json()} elif response.status_code == 202: - return JobResult(status=JobStatus.IN_PROGRESS, status_code=response.status_code, result=None) + return {"status": "pending", "status_code": response.status_code} elif response.status_code == 404: - return JobResult(status=JobStatus.NO_SUCH_JOB, status_code=response.status_code, result=None) + return {"status": "no_such_job", "status_code": response.status_code} else: - return JobResult(status=JobStatus.ERROR, status_code=response.status_code, result=None) + return {"status": "error", "status_code": response.status_code} + def partition_file_async_cancel( job_id: str, diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index cc8422713..5930b1920 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -14,7 +14,6 @@ partition_file_async_result, partition_file_async_cancel, PartitionError, - JobStatus, ) from aryn_sdk.config import ArynConfig from requests.exceptions import HTTPError @@ -177,7 +176,7 @@ def test_convert_img(): def test_invalid_job_id(): response = partition_file_async_result("INVALID_JOB_ID") - assert response.status == JobStatus.NO_SUCH_JOB + assert response["status"] == "no_such_job" def test_partition_file_async_submit(mocker): @@ -270,30 +269,30 @@ def test_partition_file_async(): start = time.time() while True: actual_result = partition_file_async_result(job_id) - if actual_result.status != JobStatus.IN_PROGRESS or time.time() - start >= ASYNC_TIMEOUT: + if actual_result["status"] != "pending" or time.time() - start >= ASYNC_TIMEOUT: break time.sleep(1) - assert actual_result.status == JobStatus.DONE + assert actual_result["status"] == "done" with open(RESOURCE_DIR / "json" / "3m_output.json", "rb") as f: expected_result = json.load(f) - assert expected_result["elements"] == actual_result.result["elements"] + assert expected_result["elements"] == actual_result["result"]["elements"] -def test_async_partition_with_unsupported_file_format(): +def test_partition_file_async_with_unsupported_file_format(): with open(RESOURCE_DIR / "image" / "unsupported-format-test-document-image.heic", "rb") as f: job_id = partition_file_async_submit(f)["job_id"] start = time.time() actual_result = partition_file_async_result(job_id) - while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: + while actual_result["status"] == "pending" and time.time() - start < ASYNC_TIMEOUT: actual_result = partition_file_async_result(job_id) time.sleep(1) - assert actual_result.status == JobStatus.DONE - assert actual_result.result is not None - assert actual_result.result["status_code"] == 500 - assert actual_result.result["error"] == "500: Failed to convert file to pdf" + assert actual_result["status"] == "done" + assert actual_result["result"] is not None + assert actual_result["result"]["status_code"] == 500 + assert actual_result["result"]["error"] == "500: Failed to convert file to pdf" def test_multiple_partition_file_async(): @@ -310,12 +309,12 @@ def test_multiple_partition_file_async(): logging.info(f"Checking job ({job_id}) {i + 1}/{num_jobs}") start = time.time() actual_result = partition_file_async_result(job_id) - while actual_result.status == JobStatus.IN_PROGRESS and time.time() - start < ASYNC_TIMEOUT: + while actual_result["status"] == "pending" and time.time() - start < ASYNC_TIMEOUT: actual_result = partition_file_async_result(job_id) time.sleep(1) logging.info(f"\tPolling Job {job_id} ({i + 1}/{num_jobs})") - assert actual_result.status == JobStatus.DONE - assert len(actual_result.result["elements"]) > 1000 + assert actual_result["status"] == "done" + assert len(actual_result["result"]["elements"]) > 1000 def test_partition_file_async_cancel(): @@ -323,17 +322,17 @@ def test_partition_file_async_cancel(): job_id = partition_file_async_submit(f)["job_id"] before_cancel_result = partition_file_async_result(job_id) - assert before_cancel_result.status == JobStatus.IN_PROGRESS + assert before_cancel_result["status"] == "pending" assert partition_file_async_cancel(job_id) # Cancellation is not reflected in the result immediately for _ in range(10): time.sleep(0.1) after_cancel_result = partition_file_async_result(job_id) - if after_cancel_result.status == JobStatus.NO_SUCH_JOB: + if after_cancel_result["status"] != "pending": break - assert after_cancel_result.status == JobStatus.IN_PROGRESS - assert after_cancel_result.status == JobStatus.NO_SUCH_JOB + assert after_cancel_result["status"] == "pending" + assert after_cancel_result["status"] == "no_such_job" def test_smoke_webhook(mocker): From 14c146e01ba92160442d737bdeb7fa3df72b38bf Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 00:48:57 -0800 Subject: [PATCH 49/58] Remove use of `inspect`, add * barrier to parameters, parse urls --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 149 ++++++++++++------- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 10 +- 2 files changed, 97 insertions(+), 62 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 077e3314e..3bd4069c3 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -1,6 +1,6 @@ from os import PathLike from typing import BinaryIO, Literal, Optional, Union, Any -from enum import Enum +from urllib.parse import urlparse, urlunparse from collections.abc import Mapping from aryn_sdk.config import ArynConfig import requests @@ -13,7 +13,6 @@ from PIL import Image import base64 import io -import inspect # URL for Aryn DocParse ARYN_DOCPARSE_URL = "https://api.aryn.cloud/v1/document/partition" @@ -31,6 +30,7 @@ def __init__(self, message: str, status_code: int) -> None: def partition_file( file: Union[BinaryIO, str, PathLike], + *, aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, threshold: Optional[Union[float, Literal["auto"]]] = None, @@ -145,6 +145,7 @@ def partition_file( def _partition_file_inner( file: Union[BinaryIO, str, PathLike], + *, aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, threshold: Optional[Union[float, Literal["auto"]]] = None, @@ -316,22 +317,47 @@ def _json_options( def partition_file_async_submit( - *args, webhook_url: Optional[str] = None, force_async_url: bool = False, **kwargs + file: Union[BinaryIO, str, PathLike], + *, + aryn_api_key: Optional[str] = None, + aryn_config: Optional[ArynConfig] = None, + threshold: Optional[Union[float, Literal["auto"]]] = None, + use_ocr: bool = False, + ocr_images: bool = False, + extract_table_structure: bool = False, + table_extraction_options: dict[str, Any] = {}, + extract_images: bool = False, + selected_pages: Optional[list[Union[list[int], int]]] = None, + chunking_options: Optional[dict[str, Any]] = None, + aps_url: Optional[str] = None, # deprecated in favor of docparse_url + docparse_url: Optional[str] = None, + ssl_verify: bool = True, + output_format: Optional[str] = None, + output_label_options: dict[str, Any] = {}, + webhook_url: Optional[str] = None, + async_submit_url: Optional[str] = None, ) -> dict[str, Any]: """ - Submits a file to be partitioned asynchronously. Takes same arguments as partition_file. - Automatically changes the endpoint to the async endpoint, unless force_async_url is set to True. + Submits a file to be partitioned asynchronously. Meant to be used in tandem with `partition_file_async_result`. + + `partition_file_async_submit` takes the same arguments as `partition_file`, and in addition it accepts a str + `webhook_url` argument which is a URL Aryn will send a POST request to when the job stops and an str + `async_submit_url` argument that can be used to override where the job is submitted to. + + Set the `docparse_url` argument to the url of the synchronous endpoint, and this function will automatically + change it to the async endpoint as long as `async_submit_url` is not set. + Args: - Includes All Arguments `partition_file` accepts + Includes All Arguments `partition_file` accepts plus those below: ... webhook_url: A URL to send a POST request to when the job is done. The resulting POST request will have a body like: {"done": [{"job_id": "aryn:j-47gpd3604e5tz79z1jro5fc"}]} - force_async_url: If set to True, then this function will not change the endpoint url automatically + async_submit_url: When set, this will override the endpoint the job is submitted to. Returns: - A dictionary containing "job_id" which can be used with the `partition_file_async_result` - function to get the results. + A dictionary containing the key "job_id" the value of which can be used with the `partition_file_async_result` + function to get the results and check the status of the async job. Single Job Example: .. code-block:: python @@ -380,58 +406,52 @@ def partition_file_async_submit( results[i] = result """ - partition_file_full_arg_spec = inspect.getfullargspec(partition_file) - ordered_partition_file_parameter_names = partition_file_full_arg_spec[0] - docparse_url_position = ordered_partition_file_parameter_names.index("docparse_url") - aps_url_position = ordered_partition_file_parameter_names.index("aps_url") - assert ( - aps_url_position < docparse_url_position - ), "partition_file_async_submit assumes that aps_url comes before docparse_url" + if async_submit_url: + docparse_url = async_submit_url + elif not aps_url and not docparse_url: + docparse_url = _convert_sync_to_async_submit_url(ARYN_DOCPARSE_URL) + else: + if aps_url: + aps_url = _convert_sync_to_async_submit_url(aps_url) + if docparse_url: + docparse_url = _convert_sync_to_async_submit_url(docparse_url) + + return _partition_file_inner( + file=file, + aryn_api_key=aryn_api_key, + aryn_config=aryn_config, + threshold=threshold, + use_ocr=use_ocr, + ocr_images=ocr_images, + extract_table_structure=extract_table_structure, + table_extraction_options=table_extraction_options, + extract_images=extract_images, + selected_pages=selected_pages, + chunking_options=chunking_options, + aps_url=aps_url, + docparse_url=docparse_url, + ssl_verify=ssl_verify, + output_format=output_format, + output_label_options=output_label_options, + webhook_url=webhook_url, + ) - args_list = list(args) - if webhook_url: - kwargs["webhook_url"] = webhook_url - - if not force_async_url: # If force_async_url is set to True, then this function will not change the endpoint - # Check if docparse_url was provided as a positional argument. If it was, then this checks to make sure that - # docparse_url is set to the async endpoint. If docparse_url is specified and it's not set to the async - # endpoint, then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. - if len(args_list) > docparse_url_position: - if "/v1/async/submit" not in args[docparse_url_position]: - assert isinstance(args_list[docparse_url_position], str) - args_list[docparse_url_position] = args_list[docparse_url_position].replace("/v1/", "/v1/async/submit/") - else: - # Since docparse_url take precedence over aps_url, check if docparse_url was provided as a keyword argument - if "docparse_url" in kwargs: - docparse_url = kwargs["docparse_url"] - assert isinstance(docparse_url, str) - if "/v1/async/submit" not in docparse_url: - kwargs["docparse_url"] = docparse_url.replace("/v1/", "/v1/async/submit/") - else: - # Check if aps_url was provided as a positional argument. If it was, then this checks to make sure that - # aps_url is set to the async endpoint. If aps_url is specified and it's not set to the async endpoint, - # then this changes it to the async endpoint assuming it was given the correct synchronous endpoint. - if len(args_list) > aps_url_position: # Checks if the aps_url is specified as a positional argument - if "/v1/async/submit" not in args[aps_url_position]: # Detect if the aps_url is set to async - args_list[aps_url_position] = args_list[aps_url_position].replace("/v1/", "/v1/async/submit/") - else: # docparse was not provided as an argument at all and aps_url was not provided positionally - if "aps_url" in kwargs: - aps_url = kwargs["aps_url"] - assert isinstance(aps_url, str) - if "/v1/async/submit" not in aps_url: - kwargs["aps_url"] = aps_url.replace("/v1/", "/v1/async/submit/") - else: - kwargs["docparse_url"] = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") - return _partition_file_inner(*args_list, **kwargs) +def _convert_sync_to_async_submit_url(url: str) -> str: + parsed_url = urlparse(url) + assert parsed_url.path.startswith("/v1/") + if parsed_url.path.startswith("/v1/async/submit"): + return url + return urlunparse((*parsed_url[:2], f"/v1/async/submit{parsed_url.path[3:]}", *parsed_url[3:])) def partition_file_async_result( job_id: str, - aryn_async_url: str = f"{ARYN_DOCPARSE_URL.split('/v1/',1)[0]}/v1/async/result", + *, aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, ssl_verify: bool = True, + async_result_url: Optional[str] = None, ) -> dict: """ Get the results of an asynchronous partitioning job by job_id. Meant to be used with `partition_file_async_submit`. @@ -441,16 +461,19 @@ def partition_file_async_result( "done", "pending", "error", or "no_such_job". Unlike `partition_file`, this function does not raise an Exception if the partitioning failed. Note the - "result" attribute of the returned JobResult contains what would have been the return value of `partition_file` - had the partitioning been done synchronously. + value corresponding to the "result" key of the returned dict contains what would have been the return value of + `partition_file` had the partitioning been done synchronously. Example: See the examples in the docstring for `partition_file_async_submit` for a full example of how to use this function. """ + if not async_result_url: + async_result_url = _convert_sync_to_async_url(ARYN_DOCPARSE_URL) + aryn_config = _process_config(aryn_api_key, aryn_config) - specific_job_url = f"{aryn_async_url}/{job_id}" + specific_job_url = f"{async_result_url.rstrip('/')}/{job_id}" http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} response = requests.get(specific_job_url, headers=http_header, stream=_set_stream(), verify=ssl_verify) @@ -464,12 +487,21 @@ def partition_file_async_result( return {"status": "error", "status_code": response.status_code} +def _convert_sync_to_async_url(url: str, prefix: str = "/result") -> str: + parsed_url = urlparse(url) + assert parsed_url.path.startswith("/v1/") + if parsed_url.path.startswith(f"/v1/async{prefix}"): + return url + return urlunparse((*parsed_url[:2], f"/v1/async{prefix}", *parsed_url[3:])) + + def partition_file_async_cancel( job_id: str, - aryn_async_url: str = f"{ARYN_DOCPARSE_URL.split('/v1/',1)[0]}/v1/async/cancel", + *, aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, ssl_verify: bool = True, + async_cancel_url: Optional[str] = None, ) -> bool: """ Cancel an asynchronous partitioning job by job_id. Meant to be used with `partition_file_async_submit`. @@ -490,9 +522,12 @@ def partition_file_async_cancel( partition_file_async_cancel(job_id) """ + if not async_cancel_url: + async_cancel_url = _convert_sync_to_async_url(ARYN_DOCPARSE_URL, "/cancel") + aryn_config = _process_config(aryn_api_key, aryn_config) - specific_job_url = f"{aryn_async_url}/{job_id}" + specific_job_url = f"{async_cancel_url.rstrip('/')}/{job_id}" http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} response = requests.post(specific_job_url, headers=http_header, stream=_set_stream(), verify=ssl_verify) if response.status_code == 200: diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 5930b1920..f2d185c1b 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -5,7 +5,6 @@ import json import time from pathlib import Path -import inspect import logging from aryn_sdk.partition import ( @@ -199,15 +198,14 @@ def test_partiton_file_async_url_forwarding(mocker): def call_partition_file(base_url: str): partition_file_async_submit("", docparse_url=base_url) partition_file_async_submit("", aps_url=base_url) - partition_file_async_submit(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, base_url) - partition_file_async_submit(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wrong", base_url) - partition_file_async_submit(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "wrong", docparse_url=base_url) + partition_file_async_submit("", aps_url="https://example.com/v1/document/partition", docparse_url=base_url) partition_file_async_submit("", aps_url=base_url, docparse_url=base_url) standard_async_url = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") def check_standard_url( file: Union[BinaryIO, str, PathLike], + *, aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, threshold: Optional[Union[float, Literal["auto"]]] = None, @@ -223,11 +221,11 @@ def check_standard_url( ssl_verify: bool = True, output_format: Optional[str] = None, output_label_options: dict[str, Any] = {}, + webhook_url: Optional[str] = None, ): url = docparse_url or aps_url assert url == standard_async_url - mocker.patch("inspect.getfullargspec").return_value = inspect.getfullargspec(partition_file) mocker.patch("aryn_sdk.partition.partition._partition_file_inner", side_effect=check_standard_url) partition_file_async_submit("") call_partition_file(ARYN_DOCPARSE_URL) @@ -238,6 +236,7 @@ def check_standard_url( def check_nonstandard_url( file: Union[BinaryIO, str, PathLike], + *, aryn_api_key: Optional[str] = None, aryn_config: Optional[ArynConfig] = None, threshold: Optional[Union[float, Literal["auto"]]] = None, @@ -253,6 +252,7 @@ def check_nonstandard_url( ssl_verify: bool = True, output_format: Optional[str] = None, output_label_options: dict[str, Any] = {}, + webhook_url: Optional[str] = None, ): url = docparse_url or aps_url assert url == nonstandard_async_url_example From 4df23ce3864073882a5fc8f9ff34e3bdedd7b1c4 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 01:09:23 -0800 Subject: [PATCH 50/58] Change two-call loop to single-call loop in `test_partition_file_async_with_unsupported_file_format` --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 2 +- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 3bd4069c3..d85d4c1c8 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -163,7 +163,7 @@ def _partition_file_inner( output_label_options: dict[str, Any] = {}, webhook_url: Optional[str] = None, ): - """Do not call this function. Use partition_file instead.""" + """Do not call this function directly. Use partition_file or partition_file_async_submit instead.""" # If you hand me a path for the file, read it in instead of trying to send the path if isinstance(file, (str, PathLike)): diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index f2d185c1b..6e13f526a 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -285,9 +285,10 @@ def test_partition_file_async_with_unsupported_file_format(): job_id = partition_file_async_submit(f)["job_id"] start = time.time() - actual_result = partition_file_async_result(job_id) - while actual_result["status"] == "pending" and time.time() - start < ASYNC_TIMEOUT: + while True: actual_result = partition_file_async_result(job_id) + if actual_result["status"] != "pending" or time.time() - start >= ASYNC_TIMEOUT: + break time.sleep(1) assert actual_result["status"] == "done" assert actual_result["result"] is not None From 75646baf43070942cf4426ddf67e5a6ed2a5ffd0 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 01:20:12 -0800 Subject: [PATCH 51/58] Change two-call loop to single-call loop in `test_multiple_partition_file_async` --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 6e13f526a..9b7ab38ef 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -307,13 +307,14 @@ def test_multiple_partition_file_async(): job_ids.append(job_id) for i, job_id in enumerate(job_ids): - logging.info(f"Checking job ({job_id}) {i + 1}/{num_jobs}") + logging.info(f"Polling job ({job_id}) {i + 1}/{num_jobs}") start = time.time() - actual_result = partition_file_async_result(job_id) - while actual_result["status"] == "pending" and time.time() - start < ASYNC_TIMEOUT: + while True: actual_result = partition_file_async_result(job_id) + if actual_result["status"] != "pending" or time.time() - start >= ASYNC_TIMEOUT: + break time.sleep(1) - logging.info(f"\tPolling Job {job_id} ({i + 1}/{num_jobs})") + logging.info(f"\tContinuing to Poll Job {job_id} ({i + 1}/{num_jobs})") assert actual_result["status"] == "done" assert len(actual_result["result"]["elements"]) > 1000 From e2edadac3429de5ced923aad97e35f5e2169f3b5 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 01:29:17 -0800 Subject: [PATCH 52/58] Fix and improve async aryn-sdk examples --- lib/aryn-sdk/README.md | 10 +++++----- lib/aryn-sdk/aryn_sdk/partition/partition.py | 11 ++++++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/aryn-sdk/README.md b/lib/aryn-sdk/README.md index cebd26dfa..f3a18a7c3 100644 --- a/lib/aryn-sdk/README.md +++ b/lib/aryn-sdk/README.md @@ -116,7 +116,7 @@ job_id = response["job_id"] # Poll for the results while True: result = partition_file_async_result(job_id) - if result.status != "pending": + if result["status"] != "pending": break time.sleep(5) ``` @@ -140,18 +140,18 @@ import time from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] -job_ids = {} +job_ids = [None] * len(files) for i, f in enumerate(files): try: job_ids[i] = partition_file_async_submit(f)["job_id"] except Exception as e: logging.warning(f"Failed to submit {f}: {e}") -results = {} -for i, job_id in job_ids.items(): +results = [None] * len(files) +for i, job_id in enumerate(job_ids): while True: result = partition_file_async_result(job_id) - if result.status != "pending": + if result["status"] != "pending": break time.sleep(5) results[i] = result diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index d85d4c1c8..f476c2f9f 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -377,7 +377,7 @@ def partition_file_async_submit( # Poll for the results while True: result = partition_file_async_result(job_id) - if result.status != "pending": + if result["status"] != "pending": break time.sleep(5) @@ -389,21 +389,22 @@ def partition_file_async_submit( from aryn_sdk.partition import partition_file_async_submit, partition_file_async_result files = [open("file1.pdf", "rb"), open("file2.docx", "rb")] - job_ids = {} + job_ids = [None] * len(files) for i, f in enumerate(files): try: job_ids[i] = partition_file_async_submit(f)["job_id"] except Exception as e: logging.warning(f"Failed to submit {f}: {e}") - results = {} - for i, job_id in job_ids.items(): + results = [None] * len(files) + for i, job_id in enumerate(job_ids): while True: result = partition_file_async_result(job_id) - if result.status != "pending": + if result["status"] != "pending": break time.sleep(5) results[i] = result + """ if async_submit_url: From a0ae467249acaf4d0d8693d19d2d4e41eeb6b304 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 01:43:18 -0800 Subject: [PATCH 53/58] Treat all 2** status codes as successful --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index f476c2f9f..5532f195c 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -204,7 +204,7 @@ def _partition_file_inner( headers["X-Aryn-Webhook"] = webhook_url resp = requests.post(docparse_url, files=files, headers=headers, stream=_set_stream(), verify=ssl_verify) - if resp.status_code not in (200, 202): + if resp.status_code < 200 or resp.status_code >= 300: raise requests.exceptions.HTTPError( f"Error: status_code: {resp.status_code}, reason: {resp.text}", response=resp ) From cd318186d512fa6720c357450e801807002064df Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 01:48:37 -0800 Subject: [PATCH 54/58] Simplify mocked function sigature --- lib/aryn-sdk/aryn_sdk/test/test_partition.py | 46 +++----------------- 1 file changed, 6 insertions(+), 40 deletions(-) diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 9b7ab38ef..3348c81db 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -204,26 +204,9 @@ def call_partition_file(base_url: str): standard_async_url = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") def check_standard_url( - file: Union[BinaryIO, str, PathLike], - *, - aryn_api_key: Optional[str] = None, - aryn_config: Optional[ArynConfig] = None, - threshold: Optional[Union[float, Literal["auto"]]] = None, - use_ocr: bool = False, - ocr_images: bool = False, - extract_table_structure: bool = False, - table_extraction_options: dict[str, Any] = {}, - extract_images: bool = False, - selected_pages: Optional[list[Union[list[int], int]]] = None, - chunking_options: Optional[dict[str, Any]] = None, - aps_url: Optional[str] = None, # deprecated in favor of docparse_url - docparse_url: Optional[str] = None, - ssl_verify: bool = True, - output_format: Optional[str] = None, - output_label_options: dict[str, Any] = {}, - webhook_url: Optional[str] = None, - ): - url = docparse_url or aps_url + file: Union[BinaryIO, str, PathLike], **kwargs, + ) -> None: + url = kwargs.get("docparse_url") or kwargs.get("aps_url") assert url == standard_async_url mocker.patch("aryn_sdk.partition.partition._partition_file_inner", side_effect=check_standard_url) @@ -235,26 +218,9 @@ def check_standard_url( nonstandard_async_url_example = nonstandard_url_example.replace("/v1/", "/v1/async/submit/") def check_nonstandard_url( - file: Union[BinaryIO, str, PathLike], - *, - aryn_api_key: Optional[str] = None, - aryn_config: Optional[ArynConfig] = None, - threshold: Optional[Union[float, Literal["auto"]]] = None, - use_ocr: bool = False, - ocr_images: bool = False, - extract_table_structure: bool = False, - table_extraction_options: dict[str, Any] = {}, - extract_images: bool = False, - selected_pages: Optional[list[Union[list[int], int]]] = None, - chunking_options: Optional[dict[str, Any]] = None, - aps_url: Optional[str] = None, # deprecated in favor of docparse_url - docparse_url: Optional[str] = None, - ssl_verify: bool = True, - output_format: Optional[str] = None, - output_label_options: dict[str, Any] = {}, - webhook_url: Optional[str] = None, - ): - url = docparse_url or aps_url + file: Union[BinaryIO, str, PathLike], **kwargs, + ) -> None: + url = kwargs.get("docparse_url") or kwargs.get("aps_url") assert url == nonstandard_async_url_example mocker.patch("aryn_sdk.partition.partition._partition_file_inner", side_effect=check_nonstandard_url) From 61a21af9265f1a045d1c0b00dce7ab228e856836 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 02:39:11 -0800 Subject: [PATCH 55/58] Add documentation for orientation correction, add test --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 11 ++- .../aryn_sdk/test/resources/json/rotated.json | 81 ++++++++++++++++++ .../aryn_sdk/test/resources/pdfs/rotated.pdf | Bin 0 -> 28447 bytes lib/aryn-sdk/aryn_sdk/test/test_partition.py | 17 +++- 4 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 lib/aryn-sdk/aryn_sdk/test/resources/json/rotated.json create mode 100644 lib/aryn-sdk/aryn_sdk/test/resources/pdfs/rotated.pdf diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 5532f195c..84f12b128 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -93,14 +93,21 @@ def partition_file( ssl_verify: verify ssl certificates. In databricks, set this to False to fix ssl imcompatibilities. output_format: controls output representation; can be set to "markdown" or "json" default: None (JSON elements) - output_label_options: A dictionary for configuring output label behavior. It supports two options: + output_label_options: A dictionary for configuring output label behavior. It supports three options: promote_title, a boolean specifying whether to pick the largest element by font size on the first page from among the elements on that page that have one of the types specified in title_candidate_elements and promote it to type "Title" if there is no element on the first page of type "Title" already. title_candidate_elements, a list of strings representing the label types allowed to be promoted to a title. + orientation_correction, a boolean specifying whether to pagewise rotate pages to the correct orientation + based off the orientation of text. Pages are rotated by increments of 90 degrees to correct their + orientation. Here is an example set of output label options: - {"promote_title": True, "title_candidate_elements": ["Section-header", "Caption"]} + { + "promote_title": True, + "title_candidate_elements": ["Section-header", "Caption"], + "orientation_correction": True + } default: None (no element is promoted to "Title") diff --git a/lib/aryn-sdk/aryn_sdk/test/resources/json/rotated.json b/lib/aryn-sdk/aryn_sdk/test/resources/json/rotated.json new file mode 100644 index 000000000..c901ad57a --- /dev/null +++ b/lib/aryn-sdk/aryn_sdk/test/resources/json/rotated.json @@ -0,0 +1,81 @@ +{ + "status": [ + "Incremental status will be shown here during execution.", + "Until you get a line that matches ' ]\n', you can convert the partial", + "output to a json document by appending '\"\"]}' to the partial output.", + "", + "T+ 0.00: Server version aryn-partitioner-0.20250122.214644 Model version 1.4", + "T+ 0.00: Received request with aryn_call_id=ef874bd3-052d-4889-93ec-5c0aabe52169", + "T+ 0.00: Waiting for scheduling", + "T+ 0.00: Preprocessing document", + "T+ 0.00: Done preprocessing document", + "T+ 0.24: Completed work on page 1", + "T+ 0.31: Completed work on page 2", + "" + ], + "status_code": 200, + "elements": [ + { + "type": "Image", + "bbox": [ + 0.509236894087358, + 0.4050663847081801, + 0.9102112926136363, + 0.5719264849494485 + ], + "properties": { + "score": 0.6749350428581238, + "image_size": null, + "image_mode": null, + "image_format": null, + "page_number": 1 + }, + "text_representation": "Rotation Test \n This is sideways! \n \n" + }, + { + "type": "Image", + "bbox": [ + 0.08446529612821692, + 0.6502498002485796, + 0.6053998161764705, + 0.7817662464488636 + ], + "properties": { + "score": 0.4510251581668854, + "image_size": null, + "image_mode": null, + "image_format": null, + "page_number": 2 + }, + "text_representation": "Rotation Test \n This is upside-Down! \n \n" + }, + { + "type": "Text", + "bbox": [ + 0.09905881096335019, + 0.6606139026988637, + 0.20984014174517462, + 0.6747579678622159 + ], + "properties": { + "score": 0.4541931748390198, + "page_number": 2 + }, + "text_representation": "Rotation Test \n" + }, + { + "type": "Text", + "bbox": [ + 0.09752255608053768, + 0.6977392578125, + 0.2741366397633272, + 0.7121780118075284 + ], + "properties": { + "score": 0.4705822765827179, + "page_number": 2 + }, + "text_representation": "This is upside-Down! \n" + } + ] +} diff --git a/lib/aryn-sdk/aryn_sdk/test/resources/pdfs/rotated.pdf b/lib/aryn-sdk/aryn_sdk/test/resources/pdfs/rotated.pdf new file mode 100644 index 0000000000000000000000000000000000000000..16a0cddd4f2dfcea86d8ff06e47ce29b3436ed2d GIT binary patch literal 28447 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 AlK=n! literal 0 HcmV?d00001 diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 3348c81db..641a18874 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -1,5 +1,5 @@ from os import PathLike -from typing import Any, BinaryIO, Literal, Optional, Union +from typing import BinaryIO, Union from aryn_sdk.partition.partition import convert_image_element, tables_to_pandas, ARYN_DOCPARSE_URL import pytest import json @@ -14,7 +14,6 @@ partition_file_async_cancel, PartitionError, ) -from aryn_sdk.config import ArynConfig from requests.exceptions import HTTPError RESOURCE_DIR = Path(__file__).parent / "resources" @@ -146,6 +145,14 @@ def test_partition_it_no_api_key(): assert einfo.value.response.json().get("detail") == "Not authenticated" +def test_partition_file_auto_rotation(): + expected = json.loads(open(RESOURCE_DIR / "json" / "rotated.json", "r").read()) + actual = partition_file( + RESOURCE_DIR / "pdfs" / "rotated.pdf", output_label_options={"orientation_correction": True} + ) + assert actual["elements"] == expected["elements"] + + def test_data_to_pandas(): with open(RESOURCE_DIR / "json" / "3m_output_ocr_table.json", "r") as f: data = json.load(f) @@ -204,7 +211,8 @@ def call_partition_file(base_url: str): standard_async_url = ARYN_DOCPARSE_URL.replace("/v1/", "/v1/async/submit/") def check_standard_url( - file: Union[BinaryIO, str, PathLike], **kwargs, + file: Union[BinaryIO, str, PathLike], + **kwargs, ) -> None: url = kwargs.get("docparse_url") or kwargs.get("aps_url") assert url == standard_async_url @@ -218,7 +226,8 @@ def check_standard_url( nonstandard_async_url_example = nonstandard_url_example.replace("/v1/", "/v1/async/submit/") def check_nonstandard_url( - file: Union[BinaryIO, str, PathLike], **kwargs, + file: Union[BinaryIO, str, PathLike], + **kwargs, ) -> None: url = kwargs.get("docparse_url") or kwargs.get("aps_url") assert url == nonstandard_async_url_example From 419a63b5e31963c4da5379e7eba0e3e5d1b7b21f Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 03:02:24 -0800 Subject: [PATCH 56/58] Add `partition_file_async_list` to `aryn-sdk`, multi-test --- lib/aryn-sdk/aryn_sdk/partition/__init__.py | 2 + lib/aryn-sdk/aryn_sdk/partition/partition.py | 48 ++++++++++++++++++++ lib/aryn-sdk/aryn_sdk/test/test_partition.py | 9 ++++ 3 files changed, 59 insertions(+) diff --git a/lib/aryn-sdk/aryn_sdk/partition/__init__.py b/lib/aryn-sdk/aryn_sdk/partition/__init__.py index 1f166929c..e91829019 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/__init__.py +++ b/lib/aryn-sdk/aryn_sdk/partition/__init__.py @@ -3,6 +3,7 @@ partition_file_async_submit, partition_file_async_result, partition_file_async_cancel, + partition_file_async_list, tables_to_pandas, table_elem_to_dataframe, convert_image_element, @@ -20,4 +21,5 @@ "partition_file_async_submit", "partition_file_async_result", "partition_file_async_cancel", + "partition_file_async_list", ] diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 84f12b128..51d2ea282 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -546,6 +546,54 @@ def partition_file_async_cancel( raise Exception("Unexpected response code.") +def partition_file_async_list( + *, + aryn_api_key: Optional[str] = None, + aryn_config: Optional[ArynConfig] = None, + ssl_verify: bool = True, + async_list_url: Optional[str] = None, +) -> dict: + """ + List pending async jobs. + + Returns: + A dict containing "jobs" which is a dict containing jobs with their job_id as their key and their value is a + dict containing the keys "path" and "state". + + { + "jobs": { + "aryn:j-sc0v0lglkauo774pioflp4l": { + "path": "/v1/document/partition", + "state": "run" + }, + "aryn:j-0eorfmvhaf9skaxm0sagrrl": { + "path": "/v1/document/partition", + "state": "run" + }, + "aryn:j-b9xp7ny0eejvqvbazjhg8rn": { + "path": "/v1/document/partition", + "state": "run" + } + } + } + + Example: + .. code-block:: python + + from aryn_sdk.partition import partition_file_async_list + partition_file_async_list() + """ + if not async_list_url: + async_list_url = _convert_sync_to_async_url(ARYN_DOCPARSE_URL, "/list") + + aryn_config = _process_config(aryn_api_key, aryn_config) + + http_header = {"Authorization": f"Bearer {aryn_config.api_key()}"} + response = requests.get(async_list_url, headers=http_header, stream=_set_stream(), verify=ssl_verify) + + return response.json() + + # Heavily adapted from lib/sycamore/data/table.py::Table.to_csv() def table_elem_to_dataframe(elem: dict) -> Optional[pd.DataFrame]: """ diff --git a/lib/aryn-sdk/aryn_sdk/test/test_partition.py b/lib/aryn-sdk/aryn_sdk/test/test_partition.py index 641a18874..15fcc21f5 100644 --- a/lib/aryn-sdk/aryn_sdk/test/test_partition.py +++ b/lib/aryn-sdk/aryn_sdk/test/test_partition.py @@ -12,6 +12,7 @@ partition_file_async_submit, partition_file_async_result, partition_file_async_cancel, + partition_file_async_list, PartitionError, ) from requests.exceptions import HTTPError @@ -275,12 +276,20 @@ def test_multiple_partition_file_async(): num_jobs = 4 job_ids = [] + before = partition_file_async_list() + logging.info(f"List before:\n{json.dumps(before, indent=4)}") + assert len(before["jobs"]) == 0 + for i in range(num_jobs): logging.info(f"Submitting job {i + 1}/{num_jobs}") job_id = partition_file_async_submit(RESOURCE_DIR / "pdfs" / "FR-2002-05-03-TRUNCATED-40.pdf")["job_id"] logging.info(f"\tJob ID: {job_id}") job_ids.append(job_id) + after = partition_file_async_list() + logging.info(f"List after:\n{json.dumps(after, indent=4)}") + assert len(after["jobs"]) == num_jobs + for i, job_id in enumerate(job_ids): logging.info(f"Polling job ({job_id}) {i + 1}/{num_jobs}") start = time.time() From b9abcd0d1526bf7978b7a960e96d09318ce7dcef Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 03:33:17 -0800 Subject: [PATCH 57/58] Make return type of `partition_file_async_result` more strict --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 51d2ea282..131ab3c87 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -460,7 +460,7 @@ def partition_file_async_result( aryn_config: Optional[ArynConfig] = None, ssl_verify: bool = True, async_result_url: Optional[str] = None, -) -> dict: +) -> dict[str, Any]: """ Get the results of an asynchronous partitioning job by job_id. Meant to be used with `partition_file_async_submit`. From 0ae375767ebd905b3dea622337720083c6721a68 Mon Sep 17 00:00:00 2001 From: Mark Lindblad Date: Fri, 24 Jan 2025 03:36:28 -0800 Subject: [PATCH 58/58] Make return type of `partition_file_async_list` more strict --- lib/aryn-sdk/aryn_sdk/partition/partition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/aryn-sdk/aryn_sdk/partition/partition.py b/lib/aryn-sdk/aryn_sdk/partition/partition.py index 131ab3c87..5a525c4cb 100644 --- a/lib/aryn-sdk/aryn_sdk/partition/partition.py +++ b/lib/aryn-sdk/aryn_sdk/partition/partition.py @@ -552,7 +552,7 @@ def partition_file_async_list( aryn_config: Optional[ArynConfig] = None, ssl_verify: bool = True, async_list_url: Optional[str] = None, -) -> dict: +) -> dict[str, Any]: """ List pending async jobs.