From dec4dfebf6c544be537f568dd4bfa89dbe020bce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 13:53:14 +0000 Subject: [PATCH 01/81] Bump boto3 from 1.34.9 to 1.34.12 Bumps [boto3](https://github.com/boto/boto3) from 1.34.9 to 1.34.12. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.9...1.34.12) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-echo10-construction.txt | 2 +- requirements-echo10-to-cmr.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index 54f5de0f..30947fd9 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.9 +boto3==1.34.12 requests-pkcs12==1.22 diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index 8ed7988e..d1513b90 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ -boto3==1.34.9 +boto3==1.34.12 Jinja2==3.1.2 shapely==2.0.2 diff --git a/requirements-echo10-to-cmr.txt b/requirements-echo10-to-cmr.txt index 02210c3e..8e2385f0 100644 --- a/requirements-echo10-to-cmr.txt +++ b/requirements-echo10-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.9 +boto3==1.34.12 requests==2.31.0 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index 9de482fc..856f72a2 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.9 +boto3==1.34.12 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index 9de482fc..856f72a2 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.9 +boto3==1.34.12 diff --git a/requirements-notify.txt b/requirements-notify.txt index 9de482fc..856f72a2 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.9 +boto3==1.34.12 diff --git a/requirements-verify.txt b/requirements-verify.txt index a0d2afac..e90bfb39 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.9 +boto3==1.34.12 jsonschema==4.20.0 From ae61e996151718345b6005205f47d36d0dc72161 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 13:37:44 +0000 Subject: [PATCH 02/81] Bump jinja2 from 3.1.2 to 3.1.3 Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-echo10-construction.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index d1513b90..cf06fe2b 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ boto3==1.34.12 -Jinja2==3.1.2 +Jinja2==3.1.3 shapely==2.0.2 From c9f7c6cff16333d05f2319cc892f7f46937690c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:43:23 +0000 Subject: [PATCH 03/81] Bump ASFHyP3/actions from 0.9.0 to 0.11.0 Bumps [ASFHyP3/actions](https://github.com/asfhyp3/actions) from 0.9.0 to 0.11.0. - [Release notes](https://github.com/asfhyp3/actions/releases) - [Changelog](https://github.com/ASFHyP3/actions/blob/develop/CHANGELOG.md) - [Commits](https://github.com/asfhyp3/actions/compare/v0.9.0...v0.11.0) --- updated-dependencies: - dependency-name: ASFHyP3/actions dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/changelog.yml | 2 +- .github/workflows/labeled-pr.yml | 2 +- .github/workflows/release-checklist-comment.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/tag-version.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index cd34ef33..0535593e 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -14,6 +14,6 @@ on: jobs: call-changelog-check-workflow: # Docs: https://github.com/ASFHyP3/actions - uses: ASFHyP3/actions/.github/workflows/reusable-changelog-check.yml@v0.9.0 + uses: ASFHyP3/actions/.github/workflows/reusable-changelog-check.yml@v0.11.0 secrets: USER_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/labeled-pr.yml b/.github/workflows/labeled-pr.yml index e4d6ff9e..e80aecf4 100644 --- a/.github/workflows/labeled-pr.yml +++ b/.github/workflows/labeled-pr.yml @@ -13,4 +13,4 @@ on: jobs: call-labeled-pr-check-workflow: # Docs: https://github.com/ASFHyP3/actions - uses: ASFHyP3/actions/.github/workflows/reusable-labeled-pr-check.yml@v0.9.0 + uses: ASFHyP3/actions/.github/workflows/reusable-labeled-pr-check.yml@v0.11.0 diff --git a/.github/workflows/release-checklist-comment.yml b/.github/workflows/release-checklist-comment.yml index 7b6f67f0..3813b1f2 100644 --- a/.github/workflows/release-checklist-comment.yml +++ b/.github/workflows/release-checklist-comment.yml @@ -10,7 +10,7 @@ on: jobs: call-release-workflow: # Docs: https://github.com/ASFHyP3/actions - uses: ASFHyP3/actions/.github/workflows/reusable-release-checklist-comment.yml@v0.9.0 + uses: ASFHyP3/actions/.github/workflows/reusable-release-checklist-comment.yml@v0.11.0 permissions: pull-requests: write secrets: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f7cf7d15..955d96e5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,7 +7,7 @@ on: jobs: call-release-workflow: - uses: ASFHyP3/actions/.github/workflows/reusable-release.yml@v0.9.0 + uses: ASFHyP3/actions/.github/workflows/reusable-release.yml@v0.11.0 with: release_prefix: GRFN Ingest release_branch: prod diff --git a/.github/workflows/tag-version.yml b/.github/workflows/tag-version.yml index b2c0e8df..8d2f6bf3 100644 --- a/.github/workflows/tag-version.yml +++ b/.github/workflows/tag-version.yml @@ -8,7 +8,7 @@ on: jobs: call-bump-version-workflow: # Docs: https://github.com/ASFHyP3/actions - uses: ASFHyP3/actions/.github/workflows/reusable-bump-version.yml@v0.9.0 + uses: ASFHyP3/actions/.github/workflows/reusable-bump-version.yml@v0.11.0 with: user: tools-bot email: UAF-asf-apd@alaska.edu From 52ec89ace34b4c284235e60b40fde1fef2c899b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 01:15:30 +0000 Subject: [PATCH 04/81] Bump boto3 from 1.34.12 to 1.34.32 Bumps [boto3](https://github.com/boto/boto3) from 1.34.12 to 1.34.32. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.12...1.34.32) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-echo10-construction.txt | 2 +- requirements-echo10-to-cmr.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index 30947fd9..481e4d66 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.12 +boto3==1.34.32 requests-pkcs12==1.22 diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index cf06fe2b..34c9504b 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ -boto3==1.34.12 +boto3==1.34.32 Jinja2==3.1.3 shapely==2.0.2 diff --git a/requirements-echo10-to-cmr.txt b/requirements-echo10-to-cmr.txt index 8e2385f0..d4cb1867 100644 --- a/requirements-echo10-to-cmr.txt +++ b/requirements-echo10-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.12 +boto3==1.34.32 requests==2.31.0 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index 856f72a2..aa2ff153 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.12 +boto3==1.34.32 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index 856f72a2..aa2ff153 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.12 +boto3==1.34.32 diff --git a/requirements-notify.txt b/requirements-notify.txt index 856f72a2..aa2ff153 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.12 +boto3==1.34.32 diff --git a/requirements-verify.txt b/requirements-verify.txt index e90bfb39..6cffb6d6 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.12 +boto3==1.34.32 jsonschema==4.20.0 From 17c1377268c4337c94ccb82ebc2b91dd3665bfd0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 01:22:12 +0000 Subject: [PATCH 05/81] Bump jsonschema from 4.20.0 to 4.21.1 Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.20.0 to 4.21.1. - [Release notes](https://github.com/python-jsonschema/jsonschema/releases) - [Changelog](https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst) - [Commits](https://github.com/python-jsonschema/jsonschema/compare/v4.20.0...v4.21.1) --- updated-dependencies: - dependency-name: jsonschema dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-verify.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-verify.txt b/requirements-verify.txt index 6cffb6d6..40e92dc3 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ boto3==1.34.32 -jsonschema==4.20.0 +jsonschema==4.21.1 From 0cdb4b3836bf79e32d7452a0d133cdfe06491240 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 01:22:50 +0000 Subject: [PATCH 06/81] Bump requests-pkcs12 from 1.22 to 1.24 Bumps [requests-pkcs12](https://github.com/m-click/requests_pkcs12) from 1.22 to 1.24. - [Commits](https://github.com/m-click/requests_pkcs12/compare/1.22...1.24) --- updated-dependencies: - dependency-name: requests-pkcs12 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index 481e4d66..0ad50b26 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ boto3==1.34.32 -requests-pkcs12==1.22 +requests-pkcs12==1.24 From bf82cd5c7e7d50eb6ccaf7fcc4b5de36e84aca97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:41:37 +0000 Subject: [PATCH 07/81] Bump boto3 from 1.34.32 to 1.34.39 Bumps [boto3](https://github.com/boto/boto3) from 1.34.32 to 1.34.39. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.32...1.34.39) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-echo10-construction.txt | 2 +- requirements-echo10-to-cmr.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index 0ad50b26..9631f4a6 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.32 +boto3==1.34.39 requests-pkcs12==1.24 diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index 34c9504b..6e860781 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ -boto3==1.34.32 +boto3==1.34.39 Jinja2==3.1.3 shapely==2.0.2 diff --git a/requirements-echo10-to-cmr.txt b/requirements-echo10-to-cmr.txt index d4cb1867..49bdb494 100644 --- a/requirements-echo10-to-cmr.txt +++ b/requirements-echo10-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.32 +boto3==1.34.39 requests==2.31.0 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index aa2ff153..44a83e86 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.32 +boto3==1.34.39 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index aa2ff153..44a83e86 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.32 +boto3==1.34.39 diff --git a/requirements-notify.txt b/requirements-notify.txt index aa2ff153..44a83e86 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.32 +boto3==1.34.39 diff --git a/requirements-verify.txt b/requirements-verify.txt index 40e92dc3..7e88d820 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.32 +boto3==1.34.39 jsonschema==4.21.1 From 53d6aab843e5f762336a92f6a74c5483373a5d27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 13:12:29 +0000 Subject: [PATCH 08/81] Bump boto3 from 1.34.39 to 1.34.42 Bumps [boto3](https://github.com/boto/boto3) from 1.34.39 to 1.34.42. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.39...1.34.42) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-echo10-construction.txt | 2 +- requirements-echo10-to-cmr.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index 9631f4a6..93a3e533 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.39 +boto3==1.34.42 requests-pkcs12==1.24 diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index 6e860781..9bb89de9 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ -boto3==1.34.39 +boto3==1.34.42 Jinja2==3.1.3 shapely==2.0.2 diff --git a/requirements-echo10-to-cmr.txt b/requirements-echo10-to-cmr.txt index 49bdb494..2ac47f12 100644 --- a/requirements-echo10-to-cmr.txt +++ b/requirements-echo10-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.39 +boto3==1.34.42 requests==2.31.0 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index 44a83e86..32bfe852 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.39 +boto3==1.34.42 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index 44a83e86..32bfe852 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.39 +boto3==1.34.42 diff --git a/requirements-notify.txt b/requirements-notify.txt index 44a83e86..32bfe852 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.39 +boto3==1.34.42 diff --git a/requirements-verify.txt b/requirements-verify.txt index 7e88d820..04669c9e 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.39 +boto3==1.34.42 jsonschema==4.21.1 From 0a311b7c0b800acf9991ff44d3267d7abc1a0650 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 13:14:45 +0000 Subject: [PATCH 09/81] Bump shapely from 2.0.2 to 2.0.3 Bumps [shapely](https://github.com/shapely/shapely) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/shapely/shapely/releases) - [Changelog](https://github.com/shapely/shapely/blob/main/CHANGES.txt) - [Commits](https://github.com/shapely/shapely/compare/2.0.2...2.0.3) --- updated-dependencies: - dependency-name: shapely dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-echo10-construction.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index 9bb89de9..a1bea30e 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ boto3==1.34.42 Jinja2==3.1.3 -shapely==2.0.2 +shapely==2.0.3 From 796820d63a6cf069e8afa056235cef9d3a664af6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 20:48:24 +0000 Subject: [PATCH 10/81] Bump boto3 from 1.34.42 to 1.34.54 Bumps [boto3](https://github.com/boto/boto3) from 1.34.42 to 1.34.54. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.42...1.34.54) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-echo10-construction.txt | 2 +- requirements-echo10-to-cmr.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index 93a3e533..f77be553 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.42 +boto3==1.34.54 requests-pkcs12==1.24 diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index a1bea30e..8caa93f8 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ -boto3==1.34.42 +boto3==1.34.54 Jinja2==3.1.3 shapely==2.0.3 diff --git a/requirements-echo10-to-cmr.txt b/requirements-echo10-to-cmr.txt index 2ac47f12..9658ce45 100644 --- a/requirements-echo10-to-cmr.txt +++ b/requirements-echo10-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.42 +boto3==1.34.54 requests==2.31.0 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index 32bfe852..19d4b3ec 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.42 +boto3==1.34.54 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index 32bfe852..19d4b3ec 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.42 +boto3==1.34.54 diff --git a/requirements-notify.txt b/requirements-notify.txt index 32bfe852..19d4b3ec 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.42 +boto3==1.34.54 diff --git a/requirements-verify.txt b/requirements-verify.txt index 04669c9e..5c0c7c18 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.42 +boto3==1.34.54 jsonschema==4.21.1 From 64062508f0670d51a867a625d18b8f4da8419866 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Tue, 12 Mar 2024 16:02:06 -0800 Subject: [PATCH 11/81] implement failing test for generating minimal umm_json output in echo10-construction --- tests/conftest.py | 20 +- tests/data/config.json | 8 + tests/data/granule.umm_json | 136 +++++++ tests/data/inputs.json | 14 + tests/data/sds_metadata.json | 145 +++++++ tests/data/v2/config.json | 84 ---- tests/data/v2/granule-amplitude.echo10 | 317 --------------- tests/data/v2/granule-coherence.echo10 | 317 --------------- .../v2/granule-connectedComponents.echo10 | 317 --------------- tests/data/v2/granule-unwrappedPhase.echo10 | 317 --------------- tests/data/v2/granule.echo10 | 328 ---------------- tests/data/v2/granule_data.json | 72 ---- tests/data/v2/inputs.json | 14 - tests/data/v2/sds_metadata.json | 76 ---- tests/data/v3/config.json | 84 ---- tests/data/v3/granule-amplitude.echo10 | 360 ----------------- tests/data/v3/granule-coherence.echo10 | 360 ----------------- .../v3/granule-connectedComponents.echo10 | 360 ----------------- tests/data/v3/granule-unwrappedPhase.echo10 | 360 ----------------- tests/data/v3/granule.echo10 | 371 ------------------ tests/data/v3/granule_data.json | 78 ---- tests/data/v3/inputs.json | 14 - tests/data/v3/sds_metadata.json | 80 ---- tests/test_echo10_construction.py | 131 +------ tests/test_verify.py | 6 +- 25 files changed, 310 insertions(+), 4059 deletions(-) create mode 100644 tests/data/config.json create mode 100644 tests/data/granule.umm_json create mode 100644 tests/data/inputs.json create mode 100644 tests/data/sds_metadata.json delete mode 100644 tests/data/v2/config.json delete mode 100644 tests/data/v2/granule-amplitude.echo10 delete mode 100644 tests/data/v2/granule-coherence.echo10 delete mode 100644 tests/data/v2/granule-connectedComponents.echo10 delete mode 100644 tests/data/v2/granule-unwrappedPhase.echo10 delete mode 100644 tests/data/v2/granule.echo10 delete mode 100644 tests/data/v2/granule_data.json delete mode 100644 tests/data/v2/inputs.json delete mode 100644 tests/data/v2/sds_metadata.json delete mode 100644 tests/data/v3/config.json delete mode 100644 tests/data/v3/granule-amplitude.echo10 delete mode 100644 tests/data/v3/granule-coherence.echo10 delete mode 100644 tests/data/v3/granule-connectedComponents.echo10 delete mode 100644 tests/data/v3/granule-unwrappedPhase.echo10 delete mode 100644 tests/data/v3/granule.echo10 delete mode 100644 tests/data/v3/granule_data.json delete mode 100644 tests/data/v3/inputs.json delete mode 100644 tests/data/v3/sds_metadata.json diff --git a/tests/conftest.py b/tests/conftest.py index 086fc9f1..29c32308 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,13 +6,7 @@ @pytest.fixture def test_data_dir(): - data_dir = Path(__file__).resolve().parent / 'data' / 'v2' - return data_dir - - -@pytest.fixture -def test_data_dir_v3(): - data_dir = Path(__file__).resolve().parent / 'data' / 'v3' + data_dir = Path(__file__).resolve().parent / 'data' return data_dir @@ -22,19 +16,7 @@ def inputs(test_data_dir): return json.load(f) -@pytest.fixture -def inputs_v3(test_data_dir_v3): - with open(f'{test_data_dir_v3}/inputs.json') as f: - return json.load(f) - - @pytest.fixture def config(test_data_dir): with open(f'{test_data_dir}/config.json') as f: return json.load(f) - - -@pytest.fixture -def config_v3(test_data_dir_v3): - with open(f'{test_data_dir_v3}/config.json') as f: - return json.load(f) diff --git a/tests/data/config.json b/tests/data/config.json new file mode 100644 index 00000000..a4cbd8db --- /dev/null +++ b/tests/data/config.json @@ -0,0 +1,8 @@ +{ + "output_bucket": "ingest-test-aux", + "api_url": "https://services-test.asf.alaska.edu/geospatial/reformat", + "granule_data": { + "download_path": "https://grfn-test.asf.alaska.edu/door/download/{0}", + "browse_path": "https://grfn-public-test.asf.alaska.edu/{0}" + } +} diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json new file mode 100644 index 00000000..8fd44066 --- /dev/null +++ b/tests/data/granule.umm_json @@ -0,0 +1,136 @@ +{ + "MetadataSpecification": { + "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", + "Name": "UMM-G", + "Version": "1.6.5" + }, + "GranuleUR": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0", + "CollectionReference": { + "ShortName": "ARIA_S1_GUNW", + "Version": 1 + }, + "RelatedUrls": [ + { + "URL": "https://grfn-test.asf.alaska.edu/door/download/S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", + "Type": "GET DATA" + }, + { + "URL": "https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.png", + "Type": "GET RELATED VISUALIZATION" + } + ], + "TemporalExtent": { + "RangeDateTime": { + "BeginningDateTime": "2024-02-12T03:26:21.285Z", + "EndingDateTime": "2024-02-12T03:27:14.053Z" + } + }, + "SpatialExtent": { + "HorizontalSpatialDomain": { + "Geometry": { + "GPolygons": [ + { + "Boundary": { + "Points": [ + { + "Longitude": 39.51836791663281, + "Latitude": 36.13651330232068 + }, + { + "Longitude": 40.43544809674256, + "Latitude": 36.002268874547816 + }, + { + "Longitude": 40.76274790474101, + "Latitude": 37.35838533475343 + }, + { + "Longitude": 40.75866504235371, + "Latitude": 37.35932440089175 + }, + { + "Longitude": 40.798970046585445, + "Latitude": 37.52515129358135 + }, + { + "Longitude": 39.83536427778569, + "Latitude": 37.672665438632244 + }, + { + "Longitude": 39.78819730789849, + "Latitude": 37.46875834003536 + }, + { + "Longitude": 39.791727200410456, + "Latitude": 37.46795488041173 + }, + { + "Longitude": 39.785100802645864, + "Latitude": 37.4391295264553 + }, + { + "Longitude": 39.29517709241584, + "Latitude": 37.510878013230325 + }, + { + "Longitude": 38.80405309241584, + "Latitude": 37.580690013230324 + }, + { + "Longitude": 38.79164966112796, + "Latitude": 37.52454535929715 + }, + { + "Longitude": 37.92590907183943, + "Latitude": 37.643205847988945 + }, + { + "Longitude": 37.64814575242416, + "Latitude": 36.277943152074116 + }, + { + "Longitude": 37.65041435955687, + "Latitude": 36.27735285568951 + }, + { + "Longitude": 37.61699395524997, + "Latitude": 36.111618275866036 + }, + { + "Longitude": 38.49576709571327, + "Latitude": 35.997073364974284 + }, + { + "Longitude": 38.50873923689982, + "Latitude": 36.056646468363866 + }, + { + "Longitude": 38.962529726360856, + "Latitude": 35.99456687090555 + }, + { + "Longitude": 39.473041057707775, + "Latitude": 35.92252341193061 + }, + { + "Longitude": 39.51836791663281, + "Latitude": 36.13651330232068 + } + ] + } + } + ] + } + } + }, + "ProviderDates": [ + { + "Date": "2024-03-02T22:12:36.000Z", + "Type": "Insert" + }, + { + "Date": "2024-03-02T22:12:36.000Z", + "Type": "Update" + } + ] +} diff --git a/tests/data/inputs.json b/tests/data/inputs.json new file mode 100644 index 00000000..9189f29c --- /dev/null +++ b/tests/data/inputs.json @@ -0,0 +1,14 @@ +{ + "Product": { + "Bucket": "grfn-content-test", + "Key": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc" + }, + "Metadata": { + "Bucket": "ingest-test-aux", + "Key": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.json" + }, + "Browse": { + "Bucket": "grfn-public-test", + "Key": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.png" + } +} diff --git a/tests/data/sds_metadata.json b/tests/data/sds_metadata.json new file mode 100644 index 00000000..c0cc1b5e --- /dev/null +++ b/tests/data/sds_metadata.json @@ -0,0 +1,145 @@ +{ + "label": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0", + "location": { + "type": "Polygon", + "coordinates": [ + [ + [ + 39.473041057707775, + 35.92252341193061 + ], + [ + 38.962529726360856, + 35.99456687090555 + ], + [ + 38.50873923689982, + 36.056646468363866 + ], + [ + 38.49576709571327, + 35.997073364974284 + ], + [ + 37.61699395524997, + 36.111618275866036 + ], + [ + 37.65041435955687, + 36.27735285568951 + ], + [ + 37.64814575242416, + 36.277943152074116 + ], + [ + 37.92590907183943, + 37.643205847988945 + ], + [ + 38.79164966112796, + 37.52454535929715 + ], + [ + 38.80405309241584, + 37.580690013230324 + ], + [ + 39.29517709241584, + 37.510878013230325 + ], + [ + 39.785100802645864, + 37.4391295264553 + ], + [ + 39.791727200410456, + 37.46795488041173 + ], + [ + 39.78819730789849, + 37.46875834003536 + ], + [ + 39.83536427778569, + 37.672665438632244 + ], + [ + 40.798970046585445, + 37.52515129358135 + ], + [ + 40.75866504235371, + 37.35932440089175 + ], + [ + 40.76274790474101, + 37.35838533475343 + ], + [ + 40.43544809674256, + 36.002268874547816 + ], + [ + 39.51836791663281, + 36.13651330232068 + ], + [ + 39.473041057707775, + 35.92252341193061 + ] + ] + ] + }, + "creation_timestamp": "2024-03-02T15:10:21.482183Z", + "version": "3.0.0", + "metadata": { + "ogr_bbox": [ + [ + 37.61699395524997, + 35.92252341193061 + ], + [ + 40.798970046585445, + 35.92252341193061 + ], + [ + 40.798970046585445, + 37.672665438632244 + ], + [ + 37.61699395524997, + 37.672665438632244 + ] + ], + "reference_scenes": [ + "S1A_IW_SLC__1SDV_20240212T032621_20240212T032649_052520_065A36_7976", + "S1A_IW_SLC__1SDV_20240212T032646_20240212T032714_052520_065A36_4F51" + ], + "secondary_scenes": [ + "S1A_IW_SLC__1SDV_20240107T032622_20240107T032650_051995_06487A_6B83", + "S1A_IW_SLC__1SDV_20240107T032648_20240107T032715_051995_06487A_DBAE" + ], + "sensing_start": "2024-02-12T03:26:21.285000Z", + "sensing_stop": "2024-02-12T03:27:14.053000Z", + "version": "3.0.0", + "temporal_baseline_days": 36, + "orbit_number": [ + 52520, + 51995 + ], + "platform": [ + "Sentinel-1A", + "Sentinel-1A" + ], + "beam_mode": "IW", + "orbit_direction": "descending", + "dataset_type": "slc", + "product_type": "interferogram", + "polarization": "VV", + "look_direction": "right", + "track_number": 123, + "perpendicular_baseline": 56.0596, + "frame_number": 19116 + } +} \ No newline at end of file diff --git a/tests/data/v2/config.json b/tests/data/v2/config.json deleted file mode 100644 index 4266ad69..00000000 --- a/tests/data/v2/config.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "output_bucket": "ingest-test-aux", - "api_url": "https://services-test.asf.alaska.edu/geospatial/reformat", - "granule_data": { - "download_path": "https://grfn-test.asf.alaska.edu/door/download/{0}", - "browse_path": "https://grfn-public-test.asf.alaska.edu/{0}", - "missions": [{ - "name": "S1 I-grams (BETA) - Kilauea Volcano, HI", - "coords": [ - [-159, 16], - [-150, 16], - [-150, 23], - [-159, 23] - ] - }, { - "name": "S1 I-grams (BETA) - Northern CA", - "coords": [ - [-126, 38.4], - [-116, 38.4], - [-116, 42], - [-126, 42] - ] - }, { - "name": "S1 I-grams (BETA) - Central CA", - "coords": [ - [-126, 37], - [-116, 37], - [-116, 38.4], - [-126, 38.4] - ] - }, { - "name": "S1 I-grams (BETA) - Southern CA", - "coords": [ - [-123, 30], - [-114, 30], - [-114, 37], - [-123, 37] - ] - }, { - "name": "S1 I-grams (BETA) - Other", - "coords": [ - [-180, -90], - [180, -90], - [180, 90], - [-180, 90] - ] - }], - "collection": { - "dataset_id": "Sentinel-1 Interferograms", - "processing_type": "GUNW_STD", - "processing_type_display": "Standard Product, NetCDF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - } - }, - "derived_products": [{ - "label": "unwrappedPhase", - "layer": "science/grids/data/unwrappedPhase", - "dataset_id": "Sentinel-1 Interferograms - Unwrapped Phase", - "processing_type": "GUNW_UNW", - "processing_type_display": "Unwrapped Phase, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, { - "label": "coherence", - "layer": "science/grids/data/coherence", - "dataset_id": "Sentinel-1 Interferograms - Coherence", - "processing_type": "GUNW_COH", - "processing_type_display": "Coherence, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, { - "label": "amplitude", - "layer": "science/grids/data/amplitude", - "dataset_id": "Sentinel-1 Interferograms - Amplitude", - "processing_type": "GUNW_AMP", - "processing_type_display": "Amplitude, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, { - "label": "connectedComponents", - "layer": "science/grids/data/connectedComponents", - "dataset_id": "Sentinel-1 Interferograms - Connected Components", - "processing_type": "GUNW_CON", - "processing_type_display": "Connected Components, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }] -} diff --git a/tests/data/v2/granule-amplitude.echo10 b/tests/data/v2/granule-amplitude.echo10 deleted file mode 100644 index 94c664c9..00000000 --- a/tests/data/v2/granule-amplitude.echo10 +++ /dev/null @@ -1,317 +0,0 @@ - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6-amplitude - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - Amplitude - - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - UNSPECIFIED - 2023-03-23T00:34:17.970611Z - - - - 2020-11-18T18:02:43.000000Z - 2020-11-18T18:03:02.000000Z - - - - - - - - - - -175.564331 - 51.22303 - - - - -179.13033705784176 - 51.61511015273788 - - - - -178.851135 - 52.739079 - - - - -175.19286980698257 - 52.345011494426714 - - - - - - - - - - - 35306 - - - - 34781 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - - - - - - ASCENDING_DESCENDING - - - descending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - HH - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 59 - - - - - - NEAR_START_LON - - - -179.13033705784176 - - - - - - NEAR_START_LAT - - - 51.22303 - - - - - - FAR_START_LON - - - -175.19286980698257 - - - - - - FAR_START_LAT - - - 51.22303 - - - - - - FAR_END_LON - - - -175.19286980698257 - - - - - - FAR_END_LAT - - - 52.739079 - - - - - - NEAR_END_LON - - - -179.13033705784176 - - - - - - NEAR_END_LAT - - - 52.739079 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_AMP - - - - - - PROCESSING_TYPE_DISPLAY - - - Amplitude, GeoTIFF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - - - - PERPENDICULAR_BASELINE - - - 13.7661 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 2.0.6 - - - - - - - - [Reference] S1A_IW_SLC__1SDV_20201118T180243_20201118T180302_035306_041FCE_A92A - - [Secondary] S1A_IW_SLC__1SDV_20201013T180243_20201013T180302_034781_040D9A_B884 - - - - - https://services-test.asf.alaska.edu/geospatial/reformat?product=S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.nc&layer=science/grids/data/amplitude - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - diff --git a/tests/data/v2/granule-coherence.echo10 b/tests/data/v2/granule-coherence.echo10 deleted file mode 100644 index 92fb0680..00000000 --- a/tests/data/v2/granule-coherence.echo10 +++ /dev/null @@ -1,317 +0,0 @@ - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6-coherence - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - Coherence - - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - UNSPECIFIED - 2023-03-23T00:34:17.970611Z - - - - 2020-11-18T18:02:43.000000Z - 2020-11-18T18:03:02.000000Z - - - - - - - - - - -175.564331 - 51.22303 - - - - -179.13033705784176 - 51.61511015273788 - - - - -178.851135 - 52.739079 - - - - -175.19286980698257 - 52.345011494426714 - - - - - - - - - - - 35306 - - - - 34781 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - - - - - - ASCENDING_DESCENDING - - - descending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - HH - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 59 - - - - - - NEAR_START_LON - - - -179.13033705784176 - - - - - - NEAR_START_LAT - - - 51.22303 - - - - - - FAR_START_LON - - - -175.19286980698257 - - - - - - FAR_START_LAT - - - 51.22303 - - - - - - FAR_END_LON - - - -175.19286980698257 - - - - - - FAR_END_LAT - - - 52.739079 - - - - - - NEAR_END_LON - - - -179.13033705784176 - - - - - - NEAR_END_LAT - - - 52.739079 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_COH - - - - - - PROCESSING_TYPE_DISPLAY - - - Coherence, GeoTIFF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - - - - PERPENDICULAR_BASELINE - - - 13.7661 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 2.0.6 - - - - - - - - [Reference] S1A_IW_SLC__1SDV_20201118T180243_20201118T180302_035306_041FCE_A92A - - [Secondary] S1A_IW_SLC__1SDV_20201013T180243_20201013T180302_034781_040D9A_B884 - - - - - https://services-test.asf.alaska.edu/geospatial/reformat?product=S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.nc&layer=science/grids/data/coherence - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - diff --git a/tests/data/v2/granule-connectedComponents.echo10 b/tests/data/v2/granule-connectedComponents.echo10 deleted file mode 100644 index eab2fa61..00000000 --- a/tests/data/v2/granule-connectedComponents.echo10 +++ /dev/null @@ -1,317 +0,0 @@ - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6-connectedComponents - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - Connected Components - - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - UNSPECIFIED - 2023-03-23T00:34:17.970611Z - - - - 2020-11-18T18:02:43.000000Z - 2020-11-18T18:03:02.000000Z - - - - - - - - - - -175.564331 - 51.22303 - - - - -179.13033705784176 - 51.61511015273788 - - - - -178.851135 - 52.739079 - - - - -175.19286980698257 - 52.345011494426714 - - - - - - - - - - - 35306 - - - - 34781 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - - - - - - ASCENDING_DESCENDING - - - descending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - HH - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 59 - - - - - - NEAR_START_LON - - - -179.13033705784176 - - - - - - NEAR_START_LAT - - - 51.22303 - - - - - - FAR_START_LON - - - -175.19286980698257 - - - - - - FAR_START_LAT - - - 51.22303 - - - - - - FAR_END_LON - - - -175.19286980698257 - - - - - - FAR_END_LAT - - - 52.739079 - - - - - - NEAR_END_LON - - - -179.13033705784176 - - - - - - NEAR_END_LAT - - - 52.739079 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_CON - - - - - - PROCESSING_TYPE_DISPLAY - - - Connected Components, GeoTIFF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - - - - PERPENDICULAR_BASELINE - - - 13.7661 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 2.0.6 - - - - - - - - [Reference] S1A_IW_SLC__1SDV_20201118T180243_20201118T180302_035306_041FCE_A92A - - [Secondary] S1A_IW_SLC__1SDV_20201013T180243_20201013T180302_034781_040D9A_B884 - - - - - https://services-test.asf.alaska.edu/geospatial/reformat?product=S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.nc&layer=science/grids/data/connectedComponents - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - diff --git a/tests/data/v2/granule-unwrappedPhase.echo10 b/tests/data/v2/granule-unwrappedPhase.echo10 deleted file mode 100644 index c5cdaa1e..00000000 --- a/tests/data/v2/granule-unwrappedPhase.echo10 +++ /dev/null @@ -1,317 +0,0 @@ - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6-unwrappedPhase - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - Unwrapped Phase - - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - UNSPECIFIED - 2023-03-23T00:34:17.970611Z - - - - 2020-11-18T18:02:43.000000Z - 2020-11-18T18:03:02.000000Z - - - - - - - - - - -175.564331 - 51.22303 - - - - -179.13033705784176 - 51.61511015273788 - - - - -178.851135 - 52.739079 - - - - -175.19286980698257 - 52.345011494426714 - - - - - - - - - - - 35306 - - - - 34781 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - - - - - - ASCENDING_DESCENDING - - - descending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - HH - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 59 - - - - - - NEAR_START_LON - - - -179.13033705784176 - - - - - - NEAR_START_LAT - - - 51.22303 - - - - - - FAR_START_LON - - - -175.19286980698257 - - - - - - FAR_START_LAT - - - 51.22303 - - - - - - FAR_END_LON - - - -175.19286980698257 - - - - - - FAR_END_LAT - - - 52.739079 - - - - - - NEAR_END_LON - - - -179.13033705784176 - - - - - - NEAR_END_LAT - - - 52.739079 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_UNW - - - - - - PROCESSING_TYPE_DISPLAY - - - Unwrapped Phase, GeoTIFF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - - - - PERPENDICULAR_BASELINE - - - 13.7661 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 2.0.6 - - - - - - - - [Reference] S1A_IW_SLC__1SDV_20201118T180243_20201118T180302_035306_041FCE_A92A - - [Secondary] S1A_IW_SLC__1SDV_20201013T180243_20201013T180302_034781_040D9A_B884 - - - - - https://services-test.asf.alaska.edu/geospatial/reformat?product=S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.nc&layer=science/grids/data/unwrappedPhase - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - diff --git a/tests/data/v2/granule.echo10 b/tests/data/v2/granule.echo10 deleted file mode 100644 index 1b1820b5..00000000 --- a/tests/data/v2/granule.echo10 +++ /dev/null @@ -1,328 +0,0 @@ - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - - - - 46.92458248138428 - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - UNSPECIFIED - 2023-03-23T00:34:17.970611Z - - - - 2020-11-18T18:02:43.000000Z - 2020-11-18T18:03:02.000000Z - - - - - - - - - - -175.564331 - 51.22303 - - - - -179.13033705784176 - 51.61511015273788 - - - - -178.851135 - 52.739079 - - - - -175.19286980698257 - 52.345011494426714 - - - - - - - - - - - 35306 - - - - 34781 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6 - - - - - - ASCENDING_DESCENDING - - - descending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - HH - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 59 - - - - - - BYTES - - - 49203991 - - - - - - NEAR_START_LON - - - -179.13033705784176 - - - - - - NEAR_START_LAT - - - 51.22303 - - - - - - FAR_START_LON - - - -175.19286980698257 - - - - - - FAR_START_LAT - - - 51.22303 - - - - - - FAR_END_LON - - - -175.19286980698257 - - - - - - FAR_END_LAT - - - 52.739079 - - - - - - NEAR_END_LON - - - -179.13033705784176 - - - - - - NEAR_END_LAT - - - 52.739079 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_STD - - - - - - PROCESSING_TYPE_DISPLAY - - - Standard Product, NetCDF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - - - - PERPENDICULAR_BASELINE - - - 13.7661 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 2.0.6 - - - - - - - - [Reference] S1A_IW_SLC__1SDV_20201118T180243_20201118T180302_035306_041FCE_A92A - - [Secondary] S1A_IW_SLC__1SDV_20201013T180243_20201013T180302_034781_040D9A_B884 - - - - - https://grfn-test.asf.alaska.edu/door/download/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.nc - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png - - - diff --git a/tests/data/v2/granule_data.json b/tests/data/v2/granule_data.json deleted file mode 100644 index 60ddae0b..00000000 --- a/tests/data/v2/granule_data.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "granule_ur": "S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6", - "insert_time": "2023-04-07T18:23:39Z", - "last_update": "2023-04-07T18:23:39Z", - "collection": "Sentinel-1 Interferograms", - "size_mb_data_granule": 46.92458248138428, - "producer_granule_id": "S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6", - "production_date_time": "2023-03-23T00:34:17.970611Z", - "beginning_date_time": "2020-11-18T18:02:43.000000Z", - "ending_date_time": "2020-11-18T18:03:02.000000Z", - "orbits": [ - 35306, - 34781 - ], - "platforms": [ - "SENTINEL-1A" - ], - "sensor_short_name": "IW", - "polygon": [ - [ - -175.564331, - 51.22303 - ], - [ - -179.13033705784176, - 51.61511015273788 - ], - [ - -178.851135, - 52.739079 - ], - [ - -175.19286980698257, - 52.345011494426714 - ] - ], - "additional_attributes": { - "GROUP_ID": "S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6", - "ASCENDING_DESCENDING": "descending", - "BEAM_MODE_TYPE": "slc", - "BEAM_MODE": "IW", - "BEAM_MODE_DESC": "interferogram", - "POLARIZATION": "HH", - "LOOK_DIRECTION": "right", - "PATH_NUMBER": 59, - "BYTES": 49203991, - "NEAR_START_LON": -179.13033705784176, - "NEAR_START_LAT": 51.22303, - "FAR_START_LON": -175.19286980698257, - "FAR_START_LAT": 51.22303, - "FAR_END_LON": -175.19286980698257, - "FAR_END_LAT": 52.739079, - "NEAR_END_LON": -179.13033705784176, - "NEAR_END_LAT": 52.739079, - "ASF_PLATFORM": "Sentinel-1 Interferogram (BETA)", - "PROCESSING_TYPE": "GUNW_STD", - "PROCESSING_TYPE_DISPLAY": "Standard Product, NetCDF", - "PROCESSING_DESCRIPTION": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF", - "THUMBNAIL_URL": "https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png", - "PERPENDICULAR_BASELINE": 13.7661, - "MISSION_NAME": "S1 I-grams (BETA) - Other", - "VERSION": "2.0.6" - }, - "input_granules": [ - "[Reference] S1A_IW_SLC__1SDV_20201118T180243_20201118T180302_035306_041FCE_A92A", - "[Secondary] S1A_IW_SLC__1SDV_20201013T180243_20201013T180302_034781_040D9A_B884" - ], - "visible": "true", - "orderable": "true", - "online_access_url": "https://grfn-test.asf.alaska.edu/door/download/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.nc", - "browse_url": "https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png" -} \ No newline at end of file diff --git a/tests/data/v2/inputs.json b/tests/data/v2/inputs.json deleted file mode 100644 index 0a3479f5..00000000 --- a/tests/data/v2/inputs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "Product": { - "Bucket": "grfn-content-test", - "Key": "S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.nc" - }, - "Metadata": { - "Bucket": "ingest-test-aux", - "Key": "S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.json" - }, - "Browse": { - "Bucket": "grfn-public-test", - "Key": "S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.png" - } -} diff --git a/tests/data/v2/sds_metadata.json b/tests/data/v2/sds_metadata.json deleted file mode 100644 index bbd1d45d..00000000 --- a/tests/data/v2/sds_metadata.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "label": "S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6", - "location": { - "type": "Polygon", - "coordinates": [ - [ - [ - -175.564331, - 51.22303 - ], - [ - -179.13033705784176, - 51.61511015273788 - ], - [ - -178.851135, - 52.739079 - ], - [ - -175.19286980698257, - 52.345011494426714 - ], - [ - -175.564331, - 51.22303 - ] - ] - ] - }, - "creation_timestamp": "2023-03-23T00:34:17.970611Z", - "version": "2.0.6", - "metadata": { - "ogr_bbox": [ - [ - -179.13033705784176, - 51.22303 - ], - [ - -175.19286980698257, - 51.22303 - ], - [ - -175.19286980698257, - 52.739079 - ], - [ - -179.13033705784176, - 52.739079 - ] - ], - "reference_scenes": [ - "S1A_IW_SLC__1SDV_20201118T180243_20201118T180302_035306_041FCE_A92A" - ], - "secondary_scenes": [ - "S1A_IW_SLC__1SDV_20201013T180243_20201013T180302_034781_040D9A_B884" - ], - "sensing_start": "2020-11-18T18:02:43.000000Z", - "sensing_stop": "2020-11-18T18:03:02.000000Z", - "orbit_number": [ - 35306, - 34781 - ], - "platform": [ - "Sentinel-1A", - "Sentinel-1A" - ], - "beam_mode": "IW", - "orbit_direction": "descending", - "dataset_type": "slc", - "product_type": "interferogram", - "polarization": "HH", - "look_direction": "right", - "track_number": 59, - "perpendicular_baseline": 13.7661 - } -} \ No newline at end of file diff --git a/tests/data/v3/config.json b/tests/data/v3/config.json deleted file mode 100644 index 4266ad69..00000000 --- a/tests/data/v3/config.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "output_bucket": "ingest-test-aux", - "api_url": "https://services-test.asf.alaska.edu/geospatial/reformat", - "granule_data": { - "download_path": "https://grfn-test.asf.alaska.edu/door/download/{0}", - "browse_path": "https://grfn-public-test.asf.alaska.edu/{0}", - "missions": [{ - "name": "S1 I-grams (BETA) - Kilauea Volcano, HI", - "coords": [ - [-159, 16], - [-150, 16], - [-150, 23], - [-159, 23] - ] - }, { - "name": "S1 I-grams (BETA) - Northern CA", - "coords": [ - [-126, 38.4], - [-116, 38.4], - [-116, 42], - [-126, 42] - ] - }, { - "name": "S1 I-grams (BETA) - Central CA", - "coords": [ - [-126, 37], - [-116, 37], - [-116, 38.4], - [-126, 38.4] - ] - }, { - "name": "S1 I-grams (BETA) - Southern CA", - "coords": [ - [-123, 30], - [-114, 30], - [-114, 37], - [-123, 37] - ] - }, { - "name": "S1 I-grams (BETA) - Other", - "coords": [ - [-180, -90], - [180, -90], - [180, 90], - [-180, 90] - ] - }], - "collection": { - "dataset_id": "Sentinel-1 Interferograms", - "processing_type": "GUNW_STD", - "processing_type_display": "Standard Product, NetCDF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - } - }, - "derived_products": [{ - "label": "unwrappedPhase", - "layer": "science/grids/data/unwrappedPhase", - "dataset_id": "Sentinel-1 Interferograms - Unwrapped Phase", - "processing_type": "GUNW_UNW", - "processing_type_display": "Unwrapped Phase, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, { - "label": "coherence", - "layer": "science/grids/data/coherence", - "dataset_id": "Sentinel-1 Interferograms - Coherence", - "processing_type": "GUNW_COH", - "processing_type_display": "Coherence, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, { - "label": "amplitude", - "layer": "science/grids/data/amplitude", - "dataset_id": "Sentinel-1 Interferograms - Amplitude", - "processing_type": "GUNW_AMP", - "processing_type_display": "Amplitude, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, { - "label": "connectedComponents", - "layer": "science/grids/data/connectedComponents", - "dataset_id": "Sentinel-1 Interferograms - Connected Components", - "processing_type": "GUNW_CON", - "processing_type_display": "Connected Components, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }] -} diff --git a/tests/data/v3/granule-amplitude.echo10 b/tests/data/v3/granule-amplitude.echo10 deleted file mode 100644 index 57189c2b..00000000 --- a/tests/data/v3/granule-amplitude.echo10 +++ /dev/null @@ -1,360 +0,0 @@ - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0-amplitude - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - Amplitude - - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - UNSPECIFIED - 2023-04-13T17:31:53.185420Z - - - - 2017-11-17T14:59:26.000000Z - 2017-11-17T14:59:53.000000Z - - - - - - - - - - 46.15097740003026 - 35.47178147041337 - - - - 46.43256 - 34.067913 - - - - 43.731243 - 33.666508 - - - - 43.40146572358155 - 35.07170234304424 - - - - - - - - - - - 8323 - - - - 19219 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - SENTINEL-1B - - - SENTINEL-1B C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - - - - - - ASCENDING_DESCENDING - - - ascending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - VV - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 72 - - - - - - NEAR_START_LON - - - 43.40146572358155 - - - - - - NEAR_START_LAT - - - 33.666508 - - - - - - FAR_START_LON - - - 46.43256 - - - - - - FAR_START_LAT - - - 33.666508 - - - - - - FAR_END_LON - - - 46.43256 - - - - - - FAR_END_LAT - - - 35.47178147041337 - - - - - - NEAR_END_LON - - - 43.40146572358155 - - - - - - NEAR_END_LAT - - - 35.47178147041337 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_AMP - - - - - - PROCESSING_TYPE_DISPLAY - - - Amplitude, GeoTIFF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - - - - PERPENDICULAR_BASELINE - - - 62.9126 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 3.0.0 - - - - - - TEMPORAL_BASELINE_DAYS - - - 6 - - - - - - WEATHER_MODEL - - - - ERA5 - - - - - - - FRAME_NUMBER - - - 7122 - - - - - - - - [Reference] S1B_IW_SLC__1SDV_20171117T145926_20171117T145953_008323_00EBAB_AFB8 - - [Secondary] S1A_IW_SLC__1SDV_20171111T150004_20171111T150032_019219_0208AF_EE89 - - - - - https://services-test.asf.alaska.edu/geospatial/reformat?product=S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.nc&layer=science/grids/data/amplitude - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - diff --git a/tests/data/v3/granule-coherence.echo10 b/tests/data/v3/granule-coherence.echo10 deleted file mode 100644 index 19f64072..00000000 --- a/tests/data/v3/granule-coherence.echo10 +++ /dev/null @@ -1,360 +0,0 @@ - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0-coherence - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - Coherence - - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - UNSPECIFIED - 2023-04-13T17:31:53.185420Z - - - - 2017-11-17T14:59:26.000000Z - 2017-11-17T14:59:53.000000Z - - - - - - - - - - 46.15097740003026 - 35.47178147041337 - - - - 46.43256 - 34.067913 - - - - 43.731243 - 33.666508 - - - - 43.40146572358155 - 35.07170234304424 - - - - - - - - - - - 8323 - - - - 19219 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - SENTINEL-1B - - - SENTINEL-1B C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - - - - - - ASCENDING_DESCENDING - - - ascending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - VV - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 72 - - - - - - NEAR_START_LON - - - 43.40146572358155 - - - - - - NEAR_START_LAT - - - 33.666508 - - - - - - FAR_START_LON - - - 46.43256 - - - - - - FAR_START_LAT - - - 33.666508 - - - - - - FAR_END_LON - - - 46.43256 - - - - - - FAR_END_LAT - - - 35.47178147041337 - - - - - - NEAR_END_LON - - - 43.40146572358155 - - - - - - NEAR_END_LAT - - - 35.47178147041337 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_COH - - - - - - PROCESSING_TYPE_DISPLAY - - - Coherence, GeoTIFF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - - - - PERPENDICULAR_BASELINE - - - 62.9126 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 3.0.0 - - - - - - TEMPORAL_BASELINE_DAYS - - - 6 - - - - - - WEATHER_MODEL - - - - ERA5 - - - - - - - FRAME_NUMBER - - - 7122 - - - - - - - - [Reference] S1B_IW_SLC__1SDV_20171117T145926_20171117T145953_008323_00EBAB_AFB8 - - [Secondary] S1A_IW_SLC__1SDV_20171111T150004_20171111T150032_019219_0208AF_EE89 - - - - - https://services-test.asf.alaska.edu/geospatial/reformat?product=S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.nc&layer=science/grids/data/coherence - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - diff --git a/tests/data/v3/granule-connectedComponents.echo10 b/tests/data/v3/granule-connectedComponents.echo10 deleted file mode 100644 index cf302a91..00000000 --- a/tests/data/v3/granule-connectedComponents.echo10 +++ /dev/null @@ -1,360 +0,0 @@ - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0-connectedComponents - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - Connected Components - - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - UNSPECIFIED - 2023-04-13T17:31:53.185420Z - - - - 2017-11-17T14:59:26.000000Z - 2017-11-17T14:59:53.000000Z - - - - - - - - - - 46.15097740003026 - 35.47178147041337 - - - - 46.43256 - 34.067913 - - - - 43.731243 - 33.666508 - - - - 43.40146572358155 - 35.07170234304424 - - - - - - - - - - - 8323 - - - - 19219 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - SENTINEL-1B - - - SENTINEL-1B C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - - - - - - ASCENDING_DESCENDING - - - ascending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - VV - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 72 - - - - - - NEAR_START_LON - - - 43.40146572358155 - - - - - - NEAR_START_LAT - - - 33.666508 - - - - - - FAR_START_LON - - - 46.43256 - - - - - - FAR_START_LAT - - - 33.666508 - - - - - - FAR_END_LON - - - 46.43256 - - - - - - FAR_END_LAT - - - 35.47178147041337 - - - - - - NEAR_END_LON - - - 43.40146572358155 - - - - - - NEAR_END_LAT - - - 35.47178147041337 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_CON - - - - - - PROCESSING_TYPE_DISPLAY - - - Connected Components, GeoTIFF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - - - - PERPENDICULAR_BASELINE - - - 62.9126 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 3.0.0 - - - - - - TEMPORAL_BASELINE_DAYS - - - 6 - - - - - - WEATHER_MODEL - - - - ERA5 - - - - - - - FRAME_NUMBER - - - 7122 - - - - - - - - [Reference] S1B_IW_SLC__1SDV_20171117T145926_20171117T145953_008323_00EBAB_AFB8 - - [Secondary] S1A_IW_SLC__1SDV_20171111T150004_20171111T150032_019219_0208AF_EE89 - - - - - https://services-test.asf.alaska.edu/geospatial/reformat?product=S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.nc&layer=science/grids/data/connectedComponents - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - diff --git a/tests/data/v3/granule-unwrappedPhase.echo10 b/tests/data/v3/granule-unwrappedPhase.echo10 deleted file mode 100644 index 1b5a41b5..00000000 --- a/tests/data/v3/granule-unwrappedPhase.echo10 +++ /dev/null @@ -1,360 +0,0 @@ - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0-unwrappedPhase - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - Unwrapped Phase - - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - UNSPECIFIED - 2023-04-13T17:31:53.185420Z - - - - 2017-11-17T14:59:26.000000Z - 2017-11-17T14:59:53.000000Z - - - - - - - - - - 46.15097740003026 - 35.47178147041337 - - - - 46.43256 - 34.067913 - - - - 43.731243 - 33.666508 - - - - 43.40146572358155 - 35.07170234304424 - - - - - - - - - - - 8323 - - - - 19219 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - SENTINEL-1B - - - SENTINEL-1B C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - - - - - - ASCENDING_DESCENDING - - - ascending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - VV - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 72 - - - - - - NEAR_START_LON - - - 43.40146572358155 - - - - - - NEAR_START_LAT - - - 33.666508 - - - - - - FAR_START_LON - - - 46.43256 - - - - - - FAR_START_LAT - - - 33.666508 - - - - - - FAR_END_LON - - - 46.43256 - - - - - - FAR_END_LAT - - - 35.47178147041337 - - - - - - NEAR_END_LON - - - 43.40146572358155 - - - - - - NEAR_END_LAT - - - 35.47178147041337 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_UNW - - - - - - PROCESSING_TYPE_DISPLAY - - - Unwrapped Phase, GeoTIFF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - - - - PERPENDICULAR_BASELINE - - - 62.9126 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 3.0.0 - - - - - - TEMPORAL_BASELINE_DAYS - - - 6 - - - - - - WEATHER_MODEL - - - - ERA5 - - - - - - - FRAME_NUMBER - - - 7122 - - - - - - - - [Reference] S1B_IW_SLC__1SDV_20171117T145926_20171117T145953_008323_00EBAB_AFB8 - - [Secondary] S1A_IW_SLC__1SDV_20171111T150004_20171111T150032_019219_0208AF_EE89 - - - - - https://services-test.asf.alaska.edu/geospatial/reformat?product=S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.nc&layer=science/grids/data/unwrappedPhase - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - diff --git a/tests/data/v3/granule.echo10 b/tests/data/v3/granule.echo10 deleted file mode 100644 index 639573a7..00000000 --- a/tests/data/v3/granule.echo10 +++ /dev/null @@ -1,371 +0,0 @@ - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - 2023-04-07T18:23:39Z - 2023-04-07T18:23:39Z - - Sentinel-1 Interferograms - - - - 46.92458248138428 - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - UNSPECIFIED - 2023-04-13T17:31:53.185420Z - - - - 2017-11-17T14:59:26.000000Z - 2017-11-17T14:59:53.000000Z - - - - - - - - - - 46.15097740003026 - 35.47178147041337 - - - - 46.43256 - 34.067913 - - - - 43.731243 - 33.666508 - - - - 43.40146572358155 - 35.07170234304424 - - - - - - - - - - - 8323 - - - - 19219 - - - - - - - SENTINEL-1A - - - SENTINEL-1A C-Band SAR - - - IW - - - - - - - - SENTINEL-1B - - - SENTINEL-1B C-Band SAR - - - IW - - - - - - - - - - - GROUP_ID - - - S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0 - - - - - - ASCENDING_DESCENDING - - - ascending - - - - - - BEAM_MODE_TYPE - - - slc - - - - - - BEAM_MODE - - - IW - - - - - - BEAM_MODE_DESC - - - interferogram - - - - - - POLARIZATION - - - VV - - - - - - LOOK_DIRECTION - - - right - - - - - - PATH_NUMBER - - - 72 - - - - - - BYTES - - - 49203991 - - - - - - NEAR_START_LON - - - 43.40146572358155 - - - - - - NEAR_START_LAT - - - 33.666508 - - - - - - FAR_START_LON - - - 46.43256 - - - - - - FAR_START_LAT - - - 33.666508 - - - - - - FAR_END_LON - - - 46.43256 - - - - - - FAR_END_LAT - - - 35.47178147041337 - - - - - - NEAR_END_LON - - - 43.40146572358155 - - - - - - NEAR_END_LAT - - - 35.47178147041337 - - - - - - ASF_PLATFORM - - - Sentinel-1 Interferogram (BETA) - - - - - - PROCESSING_TYPE - - - GUNW_STD - - - - - - PROCESSING_TYPE_DISPLAY - - - Standard Product, NetCDF - - - - - - PROCESSING_DESCRIPTION - - - Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF - - - - - - THUMBNAIL_URL - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - - - - PERPENDICULAR_BASELINE - - - 62.9126 - - - - - - MISSION_NAME - - - S1 I-grams (BETA) - Other - - - - - - VERSION - - - 3.0.0 - - - - - - TEMPORAL_BASELINE_DAYS - - - 6 - - - - - - WEATHER_MODEL - - - - ERA5 - - - - - - - FRAME_NUMBER - - - 7122 - - - - - - - - [Reference] S1B_IW_SLC__1SDV_20171117T145926_20171117T145953_008323_00EBAB_AFB8 - - [Secondary] S1A_IW_SLC__1SDV_20171111T150004_20171111T150032_019219_0208AF_EE89 - - - - - https://grfn-test.asf.alaska.edu/door/download/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.nc - - - true - true - - - https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png - - - diff --git a/tests/data/v3/granule_data.json b/tests/data/v3/granule_data.json deleted file mode 100644 index 1751d1e0..00000000 --- a/tests/data/v3/granule_data.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "granule_ur": "S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0", - "insert_time": "2023-04-07T18:23:39Z", - "last_update": "2023-04-07T18:23:39Z", - "collection": "Sentinel-1 Interferograms", - "size_mb_data_granule": 46.92458248138428, - "producer_granule_id": "S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0", - "production_date_time": "2023-04-13T17:31:53.185420Z", - "beginning_date_time": "2017-11-17T14:59:26.000000Z", - "ending_date_time": "2017-11-17T14:59:53.000000Z", - "orbits": [ - 8323, - 19219 - ], - "platforms": [ - "SENTINEL-1A", - "SENTINEL-1B" - ], - "sensor_short_name": "IW", - "polygon": [ - [ - 46.15097740003026, - 35.47178147041337 - ], - [ - 46.43256, - 34.067913 - ], - [ - 43.731243, - 33.666508 - ], - [ - 43.40146572358155, - 35.07170234304424 - ] - ], - "additional_attributes": { - "GROUP_ID": "S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0", - "ASCENDING_DESCENDING": "ascending", - "BEAM_MODE_TYPE": "slc", - "BEAM_MODE": "IW", - "BEAM_MODE_DESC": "interferogram", - "POLARIZATION": "VV", - "LOOK_DIRECTION": "right", - "PATH_NUMBER": 72, - "BYTES": 49203991, - "NEAR_START_LON": 43.40146572358155, - "NEAR_START_LAT": 33.666508, - "FAR_START_LON": 46.43256, - "FAR_START_LAT": 33.666508, - "FAR_END_LON": 46.43256, - "FAR_END_LAT": 35.47178147041337, - "NEAR_END_LON": 43.40146572358155, - "NEAR_END_LAT": 35.47178147041337, - "ASF_PLATFORM": "Sentinel-1 Interferogram (BETA)", - "PROCESSING_TYPE": "GUNW_STD", - "PROCESSING_TYPE_DISPLAY": "Standard Product, NetCDF", - "PROCESSING_DESCRIPTION": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF", - "THUMBNAIL_URL": "https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png", - "PERPENDICULAR_BASELINE": 62.9126, - "MISSION_NAME": "S1 I-grams (BETA) - Other", - "VERSION": "3.0.0", - "TEMPORAL_BASELINE_DAYS": 6, - "WEATHER_MODEL": [ - "ERA5" - ], - "FRAME_NUMBER": 7122 - }, - "input_granules": [ - "[Reference] S1B_IW_SLC__1SDV_20171117T145926_20171117T145953_008323_00EBAB_AFB8", - "[Secondary] S1A_IW_SLC__1SDV_20171111T150004_20171111T150032_019219_0208AF_EE89" - ], - "visible": "true", - "orderable": "true", - "online_access_url": "https://grfn-test.asf.alaska.edu/door/download/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.nc", - "browse_url": "https://grfn-public-test.asf.alaska.edu/S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png" -} \ No newline at end of file diff --git a/tests/data/v3/inputs.json b/tests/data/v3/inputs.json deleted file mode 100644 index b2120394..00000000 --- a/tests/data/v3/inputs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "Product": { - "Bucket": "grfn-content-test", - "Key": "S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.nc" - }, - "Metadata": { - "Bucket": "ingest-test-aux", - "Key": "S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.json" - }, - "Browse": { - "Bucket": "grfn-public-test", - "Key": "S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.png" - } -} diff --git a/tests/data/v3/sds_metadata.json b/tests/data/v3/sds_metadata.json deleted file mode 100644 index d7d182db..00000000 --- a/tests/data/v3/sds_metadata.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "label": "S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0", - "location": { - "type": "Polygon", - "coordinates": [ - [ - [ - 46.15097740003026, - 35.47178147041337 - ], - [ - 46.43256, - 34.067913 - ], - [ - 43.731243, - 33.666508 - ], - [ - 43.40146572358155, - 35.07170234304424 - ], - [ - 46.15097740003026, - 35.47178147041337 - ] - ] - ] - }, - "creation_timestamp": "2023-04-13T17:31:53.185420Z", - "version": "3.0.0", - "metadata": { - "ogr_bbox": [ - [ - 43.40146572358155, - 33.666508 - ], - [ - 46.43256, - 33.666508 - ], - [ - 46.43256, - 35.47178147041337 - ], - [ - 43.40146572358155, - 35.47178147041337 - ] - ], - "reference_scenes": [ - "S1B_IW_SLC__1SDV_20171117T145926_20171117T145953_008323_00EBAB_AFB8" - ], - "secondary_scenes": [ - "S1A_IW_SLC__1SDV_20171111T150004_20171111T150032_019219_0208AF_EE89" - ], - "sensing_start": "2017-11-17T14:59:26.000000Z", - "sensing_stop": "2017-11-17T14:59:53.000000Z", - "version": "3.0.0", - "temporal_baseline_days": 6, - "orbit_number": [ - 8323, - 19219 - ], - "platform": [ - "Sentinel-1B", - "Sentinel-1A" - ], - "beam_mode": "IW", - "orbit_direction": "ascending", - "dataset_type": "slc", - "product_type": "interferogram", - "polarization": "VV", - "look_direction": "right", - "track_number": 72, - "perpendicular_baseline": 62.9126, - "frame_number": 7122, - "weather_model": ["ERA5"] - } -} diff --git a/tests/test_echo10_construction.py b/tests/test_echo10_construction.py index 1825e3c9..7b80e3ea 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_echo10_construction.py @@ -54,141 +54,20 @@ def test_get_sds_metadata(test_data_dir, s3_stubber): assert echo10_construction.get_sds_metadata(obj) == sds_metadata -def test_get_mission(config): - polygon = [[-175.564331, 51.22303], [-179.13033705784176, 51.61511015273788], - [-178.851135, 52.739079], [-175.19286980698257, 52.345011494426714]] - - assert echo10_construction.get_mission(polygon, config['granule_data']['missions']) == 'S1 I-grams (BETA) - Other' - - -def test_get_granule_data(test_data_dir, inputs, config, mocker): - - mocker.patch('echo10_construction.now', return_value='2023-04-07T18:23:39Z') - - sds_metadata_file = test_data_dir / 'sds_metadata.json' - sds_metadata = json.loads(sds_metadata_file.read_text()) - mocker.patch('echo10_construction.get_sds_metadata', return_value=sds_metadata) - - mocker.patch('echo10_construction.get_s3_file_size', return_value=49203991) - - granule_data_file = test_data_dir / 'granule_data.json' - granule_data = json.loads(granule_data_file.read_text()) - - assert echo10_construction.get_granule_data(inputs, config['granule_data']) == granule_data - - -def test_get_granule_data_v3(test_data_dir_v3, inputs_v3, config_v3, mocker): - - mocker.patch('echo10_construction.now', return_value='2023-04-07T18:23:39Z') - - sds_metadata_file = test_data_dir_v3 / 'sds_metadata.json' - sds_metadata = json.loads(sds_metadata_file.read_text()) - mocker.patch('echo10_construction.get_sds_metadata', return_value=sds_metadata) - - mocker.patch('echo10_construction.get_s3_file_size', return_value=49203991) - - granule_data_file = test_data_dir_v3 / 'granule_data.json' - granule_data = json.loads(granule_data_file.read_text()) - - assert echo10_construction.get_granule_data(inputs_v3, config_v3['granule_data']) == granule_data - - -def test_render_granule_data_as_echo10(test_data_dir): - echo10_file = test_data_dir / 'granule.echo10' - content = echo10_file.read_text() - - granule_data_file = test_data_dir / 'granule_data.json' - granule_data = json.loads(granule_data_file.read_text()) - assert echo10_construction.render_granule_data_as_echo10(granule_data) == content - - def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): - granule_data_file = test_data_dir / 'granule_data.json' - granule_data = json.loads(granule_data_file.read_text()) - mocker.patch('echo10_construction.get_granule_data', return_value=granule_data) - mocker.patch('echo10_construction.upload_content_to_s3') - echo10_s3_objects =\ - [{'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.echo10'}, - {'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6-unwrappedPhase.echo10'}, - {'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6-coherence.echo10'}, - {'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6-amplitude.echo10'}, - {'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6-connectedComponents.echo10'}] + echo10_s3_objects = [{ + 'bucket': 'ingest-test-aux', + 'key': 'S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.umm_json', + }] assert echo10_construction.create_granule_echo10_in_s3(inputs, config) == echo10_s3_objects assert echo10_construction.upload_content_to_s3.mock_calls == [ unittest.mock.call( echo10_s3_objects[0], - (test_data_dir / 'granule.echo10').read_text(), - ), - unittest.mock.call( - echo10_s3_objects[1], - (test_data_dir / 'granule-unwrappedPhase.echo10').read_text() - ), - unittest.mock.call( - echo10_s3_objects[2], - (test_data_dir / 'granule-coherence.echo10').read_text() - ), - unittest.mock.call( - echo10_s3_objects[3], - (test_data_dir / 'granule-amplitude.echo10').read_text() - ), - unittest.mock.call( - echo10_s3_objects[4], - (test_data_dir / 'granule-connectedComponents.echo10').read_text() - ), - ] - - -def test_create_granule_echo10_in_s3_v3(test_data_dir_v3, inputs_v3, config_v3, mocker): - - granule_data_file = test_data_dir_v3 / 'granule_data.json' - granule_data = json.loads(granule_data_file.read_text()) - mocker.patch('echo10_construction.get_granule_data', return_value=granule_data) - - mocker.patch('echo10_construction.upload_content_to_s3') - - echo10_s3_objects = \ - [{'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.echo10'}, - {'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0-unwrappedPhase.echo10'}, - {'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0-coherence.echo10'}, - {'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0-amplitude.echo10'}, - {'bucket': 'ingest-test-aux', 'key': - 'S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0-connectedComponents.echo10'}] - - assert echo10_construction.create_granule_echo10_in_s3(inputs_v3, config_v3) == echo10_s3_objects - - assert echo10_construction.upload_content_to_s3.mock_calls == [ - unittest.mock.call( - echo10_s3_objects[0], - (test_data_dir_v3 / 'granule.echo10').read_text(), - ), - unittest.mock.call( - echo10_s3_objects[1], - (test_data_dir_v3 / 'granule-unwrappedPhase.echo10').read_text() - ), - unittest.mock.call( - echo10_s3_objects[2], - (test_data_dir_v3 / 'granule-coherence.echo10').read_text() - ), - unittest.mock.call( - echo10_s3_objects[3], - (test_data_dir_v3 / 'granule-amplitude.echo10').read_text() - ), - unittest.mock.call( - echo10_s3_objects[4], - (test_data_dir_v3 / 'granule-connectedComponents.echo10').read_text() + (test_data_dir / 'granule.umm_json.').read_text(), ), ] diff --git a/tests/test_verify.py b/tests/test_verify.py index 92d494d0..e8632d6f 100644 --- a/tests/test_verify.py +++ b/tests/test_verify.py @@ -22,7 +22,7 @@ def test_get_file_content_from_s3(s3_stubber): assert verify.get_file_content_from_s3('myBucket', 'myKey') == 'myContent' -def test_validate_metadata(test_data_dir, test_data_dir_v3, mocker, monkeypatch): +def test_validate_metadata(test_data_dir, mocker, monkeypatch): monkeypatch.chdir('verify/src/') mocker.patch('verify.get_file_content_from_s3', return_value='{"foo":') @@ -36,7 +36,3 @@ def test_validate_metadata(test_data_dir, test_data_dir_v3, mocker, monkeypatch) sds_metadata_file = test_data_dir / 'sds_metadata.json' mocker.patch('verify.get_file_content_from_s3', return_value=sds_metadata_file.read_text()) assert verify.validate_metadata({'Bucket': None, 'Key': None}) is None - - sds_metadata_file_v3 = test_data_dir_v3 / 'sds_metadata.json' - mocker.patch('verify.get_file_content_from_s3', return_value=sds_metadata_file_v3.read_text()) - assert verify.validate_metadata({'Bucket': None, 'Key': None}) is None From 250bd81be87f55f418cfe3a4ee52ed865f2f3822 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Tue, 12 Mar 2024 16:20:14 -0800 Subject: [PATCH 12/81] remove api_url from tests/data/config.json --- tests/data/config.json | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/data/config.json b/tests/data/config.json index a4cbd8db..e92fdbcc 100644 --- a/tests/data/config.json +++ b/tests/data/config.json @@ -1,6 +1,5 @@ { "output_bucket": "ingest-test-aux", - "api_url": "https://services-test.asf.alaska.edu/geospatial/reformat", "granule_data": { "download_path": "https://grfn-test.asf.alaska.edu/door/download/{0}", "browse_path": "https://grfn-public-test.asf.alaska.edu/{0}" From 3e9b491245f2134db030b3c9866cd18354385a8f Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 13 Mar 2024 09:53:53 -0800 Subject: [PATCH 13/81] strip out the echo10 function to start building --- .../src/echo10_construction.py | 57 +++++-------------- 1 file changed, 14 insertions(+), 43 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 86cf6050..3565e101 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -65,15 +65,15 @@ def get_mission(polygon, missions): return None -def get_granule_data(inputs, config): - sds_metadata = get_sds_metadata(inputs['Metadata']) +def get_granule_data(input, config): + sds_metadata = get_sds_metadata(input['Metadata']) granule_metadata = sds_metadata['metadata'] collection = config['collection'] granule_ur = sds_metadata['label'] - file_size = get_s3_file_size(inputs['Product']) - browse_url = config['browse_path'].format(inputs['Browse']['Key']) - online_access_url = config['download_path'].format(inputs['Product']['Key']) + file_size = get_s3_file_size(input['Product']) + browse_url = config['browse_path'].format(input['Browse']['Key']) + online_access_url = config['download_path'].format(input['Product']['Key']) polygon = sds_metadata['location']['coordinates'][0][:-1] mission = get_mission(polygon, config['missions']) @@ -147,46 +147,17 @@ def render_granule_data_as_echo10(data): return template.render(data) -def create_granule_echo10_in_s3(inputs, config): - echo10_s3_objects = [] - log.info('Creating echo10 file for %s', inputs['Product']['Key']) - granule_data = get_granule_data(inputs, config['granule_data']) - - echo10_content = render_granule_data_as_echo10(granule_data) - echo10_s3_object = { +def create_granule_echo10_in_s3(input, config): + log.info('Creating echo10 file for %s', input['Product']['Key']) + sds_metadata = get_sds_metadata(input['Metadata']) + umm_json = get_granule_data(sds_metadata, config) + output_location = { 'bucket': config['output_bucket'], - 'key': granule_data['granule_ur'] + '.echo10', + 'key': umm_json['GranuleUR'] + '.umm_json', } - echo10_s3_objects.append(echo10_s3_object) - - upload_content_to_s3(echo10_s3_object, echo10_content) - - if 'size_mb_data_granule' in granule_data: - del granule_data['size_mb_data_granule'] - - if 'BYTES' in granule_data['additional_attributes']: - del granule_data['additional_attributes']['BYTES'] - - for product in config['derived_products']: - virtual_granule_data = copy.deepcopy(granule_data) - log.info('Creating echo10 file for %s', inputs['Product']['Key'] + product['label']) - virtual_granule_data['collection'] = product['dataset_id'] - virtual_granule_data['granule_ur'] = granule_data['granule_ur'] + '-' + product['label'] - virtual_granule_data['additional_attributes']['PROCESSING_TYPE'] = product['processing_type'] - virtual_granule_data['additional_attributes']['PROCESSING_TYPE_DISPLAY'] = product['processing_type_display'] - virtual_granule_data['online_access_url'] = '{0}?product={1}&layer={2}'.format( - config['api_url'], inputs['Product']['Key'], product['layer'] - ) - echo10_content = render_granule_data_as_echo10(virtual_granule_data) - echo10_s3_object = { - 'bucket': config['output_bucket'], - 'key': virtual_granule_data['granule_ur'] + '.echo10', - } - echo10_s3_objects.append(echo10_s3_object) - - upload_content_to_s3(echo10_s3_object, echo10_content) - - return echo10_s3_objects + upload_content_to_s3(output_location, json.dumps(umm_json)) + + return output_location def lambda_handler(event, context): From 2a64194b375d83fb86f65694ced4b6845945fff9 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 14 Mar 2024 09:56:53 -0800 Subject: [PATCH 14/81] update tempalte --- echo10-construction/src/echo10.template | 147 ++++++------------ .../src/echo10_construction.py | 96 ++---------- 2 files changed, 67 insertions(+), 176 deletions(-) diff --git a/echo10-construction/src/echo10.template b/echo10-construction/src/echo10.template index cd884104..358c7914 100644 --- a/echo10-construction/src/echo10.template +++ b/echo10-construction/src/echo10.template @@ -1,96 +1,51 @@ - - {{ granule_ur }} - {{ insert_time }} - {{ last_update }} - - {{ collection }} - - - {% if size_mb_data_granule %} - {{ size_mb_data_granule }} - {% endif %} - {{ producer_granule_id }} - UNSPECIFIED - {{ production_date_time }} - - - - {{ beginning_date_time }} - {{ ending_date_time }} - - - - - - - - {% for point in polygon %} - - {{ point.0 }} - {{ point.1 }} - - {% endfor %} - - - - - - - {% for orbit in orbits %} - - {{ orbit }} - - {% endfor %} - - - {% for platform in platforms %} - - {{ platform }} - - - {{ platform }} C-Band SAR - - - {{ sensor_short_name }} - - - - - - {% endfor %} - - - {% for name, value in additional_attributes.items() %} - - {{ name }} - - {% if value is iterable and value is not string %} - {% for v in value %} - {{ v }} - {% endfor %} - {% else %} - {{ value }} - {% endif %} - - - {% endfor %} - - - {% for granule in input_granules %} - {{ granule }} - {% endfor %} - - - - {{ online_access_url }} - - - {{ orderable }} - {{ visible }} - - - {{ browse_url }} - - - - +{ + "MetadataSpecification": { + "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", + "Name": "UMM-G", + "Version": "1.6.5" + }, + "GranuleUR": granule_ur, + "CollectionReference": { + "ShortName": "ARIA_S1_GUNW", + "Version": 1 + }, + "RelatedUrls": [ + { + "URL": data_url, + "Type": "GET DATA" + }, + { + "URL": vis_url, + "Type": "GET RELATED VISUALIZATION" + } + ], + "TemporalExtent": { + "RangeDateTime": { + "BeginningDateTime": sensing_start, + "EndingDateTime": sensing_stop + } + }, + "SpatialExtent": { + "HorizontalSpatialDomain": { + "Geometry": { + "GPolygons": [ + { + "Boundary": { + "Points": polygon + } + } + ] + } + } + }, + "ProviderDates": [ + { + "Date": creation_timestamp, + "Type": "Insert" + }, + { + "Date": upload_timestamp, + "Type": "Update" + } + ] +} \ No newline at end of file diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 3565e101..9319826f 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -56,101 +56,37 @@ def get_sds_metadata(obj): return sds_metadata -def get_mission(polygon, missions): - granule = Polygon(polygon) - for mission in missions: - aoi = Polygon(mission['coords']) - if granule.intersects(aoi): - return mission['name'] - return None - +def render_granule_data_as_echo10(data): + with open(TEMPLATE_FILE, 'r') as t: + template_text = t.read() + template = Template(template_text) + return template.render(data) -def get_granule_data(input, config): - sds_metadata = get_sds_metadata(input['Metadata']) - granule_metadata = sds_metadata['metadata'] - collection = config['collection'] +def render_granule_metadata(sds_metadata, config): granule_ur = sds_metadata['label'] - file_size = get_s3_file_size(input['Product']) + download_url = config['granule_data']['download_path'].strip browse_url = config['browse_path'].format(input['Browse']['Key']) - online_access_url = config['download_path'].format(input['Product']['Key']) polygon = sds_metadata['location']['coordinates'][0][:-1] - mission = get_mission(polygon, config['missions']) - - input_granules = ['[Reference] {0}'.format(g) for g in granule_metadata['reference_scenes']] - input_granules += ['[Secondary] {0}'.format(g) for g in granule_metadata['secondary_scenes']] data = { 'granule_ur': granule_ur, - 'insert_time': now(), - 'last_update': now(), - 'collection': collection['dataset_id'], - 'size_mb_data_granule': float(file_size) / 1024 / 1024, - 'producer_granule_id': sds_metadata['label'], - 'production_date_time': sds_metadata['creation_timestamp'], - 'beginning_date_time': granule_metadata['sensing_start'], - 'ending_date_time': granule_metadata['sensing_stop'], - 'orbits': granule_metadata['orbit_number'], - 'platforms': sorted(set(p.upper() for p in granule_metadata['platform'])), - 'sensor_short_name': granule_metadata['beam_mode'], - 'polygon': polygon, - 'additional_attributes': { - 'GROUP_ID': sds_metadata['label'].replace('.', '-'), - 'ASCENDING_DESCENDING': granule_metadata['orbit_direction'], - 'BEAM_MODE_TYPE': granule_metadata['dataset_type'], - 'BEAM_MODE': granule_metadata['beam_mode'], - 'BEAM_MODE_DESC': granule_metadata['product_type'], - 'POLARIZATION': granule_metadata['polarization'], - 'LOOK_DIRECTION': granule_metadata['look_direction'], - 'PATH_NUMBER': granule_metadata['track_number'], - 'BYTES': file_size, - 'NEAR_START_LON': granule_metadata['ogr_bbox'][0][0], - 'NEAR_START_LAT': granule_metadata['ogr_bbox'][0][1], - 'FAR_START_LON': granule_metadata['ogr_bbox'][1][0], - 'FAR_START_LAT': granule_metadata['ogr_bbox'][1][1], - 'FAR_END_LON': granule_metadata['ogr_bbox'][2][0], - 'FAR_END_LAT': granule_metadata['ogr_bbox'][2][1], - 'NEAR_END_LON': granule_metadata['ogr_bbox'][3][0], - 'NEAR_END_LAT': granule_metadata['ogr_bbox'][3][1], - 'ASF_PLATFORM': 'Sentinel-1 Interferogram (BETA)', - 'PROCESSING_TYPE': collection['processing_type'], - 'PROCESSING_TYPE_DISPLAY': collection['processing_type_display'], - 'PROCESSING_DESCRIPTION': collection['processing_description'], - 'THUMBNAIL_URL': browse_url, - 'PERPENDICULAR_BASELINE': granule_metadata['perpendicular_baseline'], - 'MISSION_NAME': mission, - 'VERSION': sds_metadata['version'], - }, - 'input_granules': input_granules, - 'visible': 'true', - 'orderable': 'true', - 'online_access_url': online_access_url, - 'browse_url': browse_url, + 'data_url': f'{download_url}/{granule_ur}.nc', + 'vis_url': f'{browse_url}/{granule_ur}.png', + "sensing_start": sds_metadata['metadata']['sensing_start'], + "sensing_stop": sds_metadata['metadata']['sensing_stop'], + "polygon": polygon, + "creation_timestamp": sds_metadata['creation_timestamp'], + "upload_timestamp": now() } - if 'temporal_baseline_days' in granule_metadata: - data['additional_attributes']['TEMPORAL_BASELINE_DAYS'] = granule_metadata['temporal_baseline_days'] - - if 'weather_model' in granule_metadata: - data['additional_attributes']['WEATHER_MODEL'] = granule_metadata['weather_model'] - - if 'frame_number' in granule_metadata: - data['additional_attributes']['FRAME_NUMBER'] = granule_metadata['frame_number'] - - return data - - -def render_granule_data_as_echo10(data): - with open(TEMPLATE_FILE, 'r') as t: - template_text = t.read() - template = Template(template_text) - return template.render(data) + return render_granule_data_as_echo10(data) def create_granule_echo10_in_s3(input, config): log.info('Creating echo10 file for %s', input['Product']['Key']) sds_metadata = get_sds_metadata(input['Metadata']) - umm_json = get_granule_data(sds_metadata, config) + umm_json = render_granule_metadata(sds_metadata, config) output_location = { 'bucket': config['output_bucket'], 'key': umm_json['GranuleUR'] + '.umm_json', From 06ada3afa666d2bcaa7dface8364dde3caeacbe9 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 14 Mar 2024 12:18:18 -0800 Subject: [PATCH 15/81] format polygon --- echo10-construction/src/echo10_construction.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 9319826f..d0c986fe 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -56,6 +56,13 @@ def get_sds_metadata(obj): return sds_metadata +def format_polygon_echo10(polygon): + coordinates = [] + for lat, long in polygon: + coordinates.append({"Longitude": long, "Latitude": lat}) + return coordinates + + def render_granule_data_as_echo10(data): with open(TEMPLATE_FILE, 'r') as t: template_text = t.read() @@ -65,18 +72,17 @@ def render_granule_data_as_echo10(data): def render_granule_metadata(sds_metadata, config): granule_ur = sds_metadata['label'] - download_url = config['granule_data']['download_path'].strip - browse_url = config['browse_path'].format(input['Browse']['Key']) - polygon = sds_metadata['location']['coordinates'][0][:-1] + download_url = config['granule_data']['download_path'][:-3] + browse_url = config['granule_data']['browse_path'][:-3] + polygon = format_polygon_echo10(sds_metadata['location']['coordinates'][0][:-1]) data = { 'granule_ur': granule_ur, - 'data_url': f'{download_url}/{granule_ur}.nc', - 'vis_url': f'{browse_url}/{granule_ur}.png', + 'data_url': f'{download_url}{granule_ur}.nc', + 'vis_url': f'{browse_url}{granule_ur}.png', "sensing_start": sds_metadata['metadata']['sensing_start'], "sensing_stop": sds_metadata['metadata']['sensing_stop'], "polygon": polygon, - "creation_timestamp": sds_metadata['creation_timestamp'], "upload_timestamp": now() } From 26a646077e058b36002f1fb1fdc9323aaba447ed Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 14 Mar 2024 14:49:11 -0800 Subject: [PATCH 16/81] try to get tests working --- echo10-construction/src/echo10.template | 19 +++++------ .../src/echo10_construction.py | 34 ++++++++++++------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/echo10-construction/src/echo10.template b/echo10-construction/src/echo10.template index 358c7914..41cf3ba2 100644 --- a/echo10-construction/src/echo10.template +++ b/echo10-construction/src/echo10.template @@ -1,28 +1,27 @@ -{ - "MetadataSpecification": { +{"MetadataSpecification": { "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", "Name": "UMM-G", "Version": "1.6.5" }, - "GranuleUR": granule_ur, + "GranuleUR": {{ granule_ur }}, "CollectionReference": { "ShortName": "ARIA_S1_GUNW", "Version": 1 }, "RelatedUrls": [ { - "URL": data_url, + "URL": {{ data_url }}, "Type": "GET DATA" }, { - "URL": vis_url, + "URL": {{ vis_url }}, "Type": "GET RELATED VISUALIZATION" } ], "TemporalExtent": { "RangeDateTime": { - "BeginningDateTime": sensing_start, - "EndingDateTime": sensing_stop + "BeginningDateTime": {{ sensing_start }}, + "EndingDateTime": {{ sensing_stop }} } }, "SpatialExtent": { @@ -31,7 +30,7 @@ "GPolygons": [ { "Boundary": { - "Points": polygon + "Points": {{ polygon }} } } ] @@ -40,11 +39,11 @@ }, "ProviderDates": [ { - "Date": creation_timestamp, + "Date": {{ timestamp }}, "Type": "Insert" }, { - "Date": upload_timestamp, + "Date": {{ timestamp }}, "Type": "Update" } ] diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index d0c986fe..a8e4c8dc 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -1,4 +1,3 @@ -import copy import json import os import pathlib @@ -6,15 +5,14 @@ from logging import getLogger import boto3 -from jinja2 import Template -from shapely.geometry import Polygon - +from jinja2 import Environment, PackageLoader, StrictUndefined, select_autoescape, Template, FileSystemLoader log = getLogger() log.setLevel('INFO') CONFIG = json.loads(os.getenv('CONFIG')) -TEMPLATE_FILE = pathlib.Path(__file__).resolve().parent / 'echo10.template' +TEMPLATE_DIR = pathlib.Path(__file__).resolve().parent +TEMPLATE_FILE = TEMPLATE_DIR / 'echo10.template' s3 = boto3.resource('s3') @@ -51,8 +49,10 @@ def get_s3_file_size(obj): def get_sds_metadata(obj): - content = get_file_content_from_s3(obj['Bucket'], obj['Key']) - sds_metadata = json.loads(content) + #content = get_file_content_from_s3(obj['Bucket'], obj['Key']) + content = pathlib.Path(__file__).parents[2].resolve() / 'tests/data/sds_metadata.json' + with open(content) as f: + sds_metadata = json.load(f) return sds_metadata @@ -67,7 +67,15 @@ def render_granule_data_as_echo10(data): with open(TEMPLATE_FILE, 'r') as t: template_text = t.read() template = Template(template_text) - return template.render(data) + return json.loads(template.render(data)) + + +def render_template(payload: dict) -> str: + loader = FileSystemLoader(str(TEMPLATE_DIR)) + env = Environment(loader=loader, autoescape=select_autoescape('.json.j2')) + env.filters['jsonify'] = json.dumps + template = env.get_template(str(TEMPLATE_FILE)) + return template.render(payload) def render_granule_metadata(sds_metadata, config): @@ -83,16 +91,16 @@ def render_granule_metadata(sds_metadata, config): "sensing_start": sds_metadata['metadata']['sensing_start'], "sensing_stop": sds_metadata['metadata']['sensing_stop'], "polygon": polygon, - "upload_timestamp": now() + "timestamp": now() } return render_granule_data_as_echo10(data) -def create_granule_echo10_in_s3(input, config): - log.info('Creating echo10 file for %s', input['Product']['Key']) - sds_metadata = get_sds_metadata(input['Metadata']) - umm_json = render_granule_metadata(sds_metadata, config) +def create_granule_echo10_in_s3(inputs, config): + log.info('Creating echo10 file for %s', inputs['Product']['Key']) + sds_metadata = get_sds_metadata(inputs['Metadata']) + umm_json = json.loads(render_granule_metadata(sds_metadata, config)) output_location = { 'bucket': config['output_bucket'], 'key': umm_json['GranuleUR'] + '.umm_json', From 89f95d2f4e9aaf0e34c855bb76e543e67db12b62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 14:00:49 +0000 Subject: [PATCH 17/81] Bump boto3 from 1.34.54 to 1.34.64 Bumps [boto3](https://github.com/boto/boto3) from 1.34.54 to 1.34.64. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.54...1.34.64) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-echo10-construction.txt | 2 +- requirements-echo10-to-cmr.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index f77be553..d6c17baf 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.54 +boto3==1.34.64 requests-pkcs12==1.24 diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index 8caa93f8..ab0fe999 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ -boto3==1.34.54 +boto3==1.34.64 Jinja2==3.1.3 shapely==2.0.3 diff --git a/requirements-echo10-to-cmr.txt b/requirements-echo10-to-cmr.txt index 9658ce45..015017b3 100644 --- a/requirements-echo10-to-cmr.txt +++ b/requirements-echo10-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.54 +boto3==1.34.64 requests==2.31.0 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index 19d4b3ec..d77cfb82 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.54 +boto3==1.34.64 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index 19d4b3ec..d77cfb82 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.54 +boto3==1.34.64 diff --git a/requirements-notify.txt b/requirements-notify.txt index 19d4b3ec..d77cfb82 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.54 +boto3==1.34.64 diff --git a/requirements-verify.txt b/requirements-verify.txt index 5c0c7c18..b0bd3e02 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.54 +boto3==1.34.64 jsonschema==4.21.1 From cd38ed04a8d725e071d40d6ebc6337b23e8283d8 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 10:12:00 -0800 Subject: [PATCH 18/81] remove jinja when assembling umm_json --- echo10-construction/src/echo10.template | 50 ----------- .../src/echo10_construction.py | 85 ++++++++++++------- 2 files changed, 53 insertions(+), 82 deletions(-) delete mode 100644 echo10-construction/src/echo10.template diff --git a/echo10-construction/src/echo10.template b/echo10-construction/src/echo10.template deleted file mode 100644 index 41cf3ba2..00000000 --- a/echo10-construction/src/echo10.template +++ /dev/null @@ -1,50 +0,0 @@ -{"MetadataSpecification": { - "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", - "Name": "UMM-G", - "Version": "1.6.5" - }, - "GranuleUR": {{ granule_ur }}, - "CollectionReference": { - "ShortName": "ARIA_S1_GUNW", - "Version": 1 - }, - "RelatedUrls": [ - { - "URL": {{ data_url }}, - "Type": "GET DATA" - }, - { - "URL": {{ vis_url }}, - "Type": "GET RELATED VISUALIZATION" - } - ], - "TemporalExtent": { - "RangeDateTime": { - "BeginningDateTime": {{ sensing_start }}, - "EndingDateTime": {{ sensing_stop }} - } - }, - "SpatialExtent": { - "HorizontalSpatialDomain": { - "Geometry": { - "GPolygons": [ - { - "Boundary": { - "Points": {{ polygon }} - } - } - ] - } - } - }, - "ProviderDates": [ - { - "Date": {{ timestamp }}, - "Type": "Insert" - }, - { - "Date": {{ timestamp }}, - "Type": "Update" - } - ] -} \ No newline at end of file diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index a8e4c8dc..dd41e017 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -5,15 +5,11 @@ from logging import getLogger import boto3 -from jinja2 import Environment, PackageLoader, StrictUndefined, select_autoescape, Template, FileSystemLoader log = getLogger() log.setLevel('INFO') CONFIG = json.loads(os.getenv('CONFIG')) -TEMPLATE_DIR = pathlib.Path(__file__).resolve().parent -TEMPLATE_FILE = TEMPLATE_DIR / 'echo10.template' - s3 = boto3.resource('s3') @@ -49,7 +45,7 @@ def get_s3_file_size(obj): def get_sds_metadata(obj): - #content = get_file_content_from_s3(obj['Bucket'], obj['Key']) + # content = get_file_content_from_s3(obj['Bucket'], obj['Key']) content = pathlib.Path(__file__).parents[2].resolve() / 'tests/data/sds_metadata.json' with open(content) as f: sds_metadata = json.load(f) @@ -63,44 +59,69 @@ def format_polygon_echo10(polygon): return coordinates -def render_granule_data_as_echo10(data): - with open(TEMPLATE_FILE, 'r') as t: - template_text = t.read() - template = Template(template_text) - return json.loads(template.render(data)) - - -def render_template(payload: dict) -> str: - loader = FileSystemLoader(str(TEMPLATE_DIR)) - env = Environment(loader=loader, autoescape=select_autoescape('.json.j2')) - env.filters['jsonify'] = json.dumps - template = env.get_template(str(TEMPLATE_FILE)) - return template.render(payload) - - -def render_granule_metadata(sds_metadata, config): +def render_granule_metadata(sds_metadata, config) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'][:-3] browse_url = config['granule_data']['browse_path'][:-3] polygon = format_polygon_echo10(sds_metadata['location']['coordinates'][0][:-1]) - data = { - 'granule_ur': granule_ur, - 'data_url': f'{download_url}{granule_ur}.nc', - 'vis_url': f'{browse_url}{granule_ur}.png', - "sensing_start": sds_metadata['metadata']['sensing_start'], - "sensing_stop": sds_metadata['metadata']['sensing_stop'], - "polygon": polygon, - "timestamp": now() + return { + "MetadataSpecification": { + "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", + "Name": "UMM-G", + "Version": "1.6.5" + }, + "GranuleUR": granule_ur, + "CollectionReference": { + "ShortName": "ARIA_S1_GUNW", + "Version": 1 + }, + "RelatedUrls": [ + { + "URL": f'{download_url}{granule_ur}.nc', + "Type": "GET DATA" + }, + { + "URL": f'{browse_url}{granule_ur}.png', + "Type": "GET RELATED VISUALIZATION" + } + ], + "TemporalExtent": { + "RangeDateTime": { + "BeginningDateTime": sds_metadata['metadata']['sensing_start'], + "EndingDateTime": sds_metadata['metadata']['sensing_stop'] + } + }, + "SpatialExtent": { + "HorizontalSpatialDomain": { + "Geometry": { + "GPolygons": [ + { + "Boundary": { + "Points": polygon + } + } + ] + } + } + }, + "ProviderDates": [ + { + "Date": now(), + "Type": "Insert" + }, + { + "Date": now(), + "Type": "Update" + } + ] } - return render_granule_data_as_echo10(data) - def create_granule_echo10_in_s3(inputs, config): log.info('Creating echo10 file for %s', inputs['Product']['Key']) sds_metadata = get_sds_metadata(inputs['Metadata']) - umm_json = json.loads(render_granule_metadata(sds_metadata, config)) + umm_json = render_granule_metadata(sds_metadata, config) output_location = { 'bucket': config['output_bucket'], 'key': umm_json['GranuleUR'] + '.umm_json', From 18b98f9885b45a4928d2c6f5e27cfae56580f3c9 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 10:16:32 -0800 Subject: [PATCH 19/81] fix tests --- Makefile | 2 +- tests/test_echo10_construction.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index fdb3c90d..d83e769c 100644 --- a/Makefile +++ b/Makefile @@ -5,4 +5,4 @@ export CONFIG = "{}" test_file ?= tests/ pytest: - pytest $(test_file) + pytest -vv $(test_file) diff --git a/tests/test_echo10_construction.py b/tests/test_echo10_construction.py index 7b80e3ea..7969909f 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_echo10_construction.py @@ -58,16 +58,16 @@ def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): mocker.patch('echo10_construction.upload_content_to_s3') - echo10_s3_objects = [{ + echo10_s3_object = { 'bucket': 'ingest-test-aux', - 'key': 'S1-GUNW-A-R-072-tops-20171117_20171111-145939-00043E_00034N-PP-428e-v3_0_0.umm_json', - }] + 'key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.umm_json', + } - assert echo10_construction.create_granule_echo10_in_s3(inputs, config) == echo10_s3_objects + assert echo10_construction.create_granule_echo10_in_s3(inputs, config) == echo10_s3_object assert echo10_construction.upload_content_to_s3.mock_calls == [ unittest.mock.call( - echo10_s3_objects[0], - (test_data_dir / 'granule.umm_json.').read_text(), + echo10_s3_object, + (test_data_dir / 'granule.umm_json').read_text(), ), ] From 3f69fe83a0c96acdc5934685d4bb9a6c2b158549 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 10:25:28 -0800 Subject: [PATCH 20/81] more test fixes --- tests/test_echo10_construction.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_echo10_construction.py b/tests/test_echo10_construction.py index 7969909f..8828a862 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_echo10_construction.py @@ -55,7 +55,7 @@ def test_get_sds_metadata(test_data_dir, s3_stubber): def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): - + mocker.patch('echo10_construction.now', return_value='2024-03-02T22:12:36.000Z') mocker.patch('echo10_construction.upload_content_to_s3') echo10_s3_object = { @@ -68,6 +68,6 @@ def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): assert echo10_construction.upload_content_to_s3.mock_calls == [ unittest.mock.call( echo10_s3_object, - (test_data_dir / 'granule.umm_json').read_text(), + json.dumps(json.loads((test_data_dir / 'granule.umm_json').read_text())), ), ] From 556c4d9329acf0a2f607a96a5867a8ce2d529ea7 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 10:31:18 -0800 Subject: [PATCH 21/81] fix date format in granule.umm_json --- tests/data/granule.umm_json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 8fd44066..91437206 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -21,8 +21,8 @@ ], "TemporalExtent": { "RangeDateTime": { - "BeginningDateTime": "2024-02-12T03:26:21.285Z", - "EndingDateTime": "2024-02-12T03:27:14.053Z" + "BeginningDateTime": "2024-02-12T03:26:21.285000Z", + "EndingDateTime": "2024-02-12T03:27:14.053000Z" } }, "SpatialExtent": { From 5b31581c6cb889c9352da964e7dcd822bc06a396 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 18 Mar 2024 10:43:10 -0800 Subject: [PATCH 22/81] switch lat long --- echo10-construction/src/echo10_construction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index dd41e017..1712e5b5 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -55,7 +55,7 @@ def get_sds_metadata(obj): def format_polygon_echo10(polygon): coordinates = [] for lat, long in polygon: - coordinates.append({"Longitude": long, "Latitude": lat}) + coordinates.append({"Latitude": lat, "Longitude": long}) return coordinates From 7c656d6855ee0842395a3ed6f763b173432cc55e Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 18 Mar 2024 10:49:03 -0800 Subject: [PATCH 23/81] remove stripping last coordinate --- echo10-construction/src/echo10_construction.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 1712e5b5..979638cc 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -56,6 +56,7 @@ def format_polygon_echo10(polygon): coordinates = [] for lat, long in polygon: coordinates.append({"Latitude": lat, "Longitude": long}) + print(len(coordinates)) return coordinates @@ -63,7 +64,7 @@ def render_granule_metadata(sds_metadata, config) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'][:-3] browse_url = config['granule_data']['browse_path'][:-3] - polygon = format_polygon_echo10(sds_metadata['location']['coordinates'][0][:-1]) + polygon = format_polygon_echo10(sds_metadata['location']['coordinates'][0]) return { "MetadataSpecification": { From a5055870f8492b7e769749b5aa6229581a50a734 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 18 Mar 2024 10:49:41 -0800 Subject: [PATCH 24/81] remove unnecessary print --- echo10-construction/src/echo10_construction.py | 1 - 1 file changed, 1 deletion(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 979638cc..96570c85 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -56,7 +56,6 @@ def format_polygon_echo10(polygon): coordinates = [] for lat, long in polygon: coordinates.append({"Latitude": lat, "Longitude": long}) - print(len(coordinates)) return coordinates From 8932b70f4921b16dbc89a193ebb5411d866977ac Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 10:52:31 -0800 Subject: [PATCH 25/81] sort keys in json.dumps calls for easier testing --- echo10-construction/src/echo10_construction.py | 2 +- tests/test_echo10_construction.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 979638cc..a75fe0e0 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -127,7 +127,7 @@ def create_granule_echo10_in_s3(inputs, config): 'bucket': config['output_bucket'], 'key': umm_json['GranuleUR'] + '.umm_json', } - upload_content_to_s3(output_location, json.dumps(umm_json)) + upload_content_to_s3(output_location, json.dumps(umm_json, sort_keys=True)) return output_location diff --git a/tests/test_echo10_construction.py b/tests/test_echo10_construction.py index 8828a862..7b2181a8 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_echo10_construction.py @@ -68,6 +68,6 @@ def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): assert echo10_construction.upload_content_to_s3.mock_calls == [ unittest.mock.call( echo10_s3_object, - json.dumps(json.loads((test_data_dir / 'granule.umm_json').read_text())), + json.dumps(json.loads((test_data_dir / 'granule.umm_json').read_text()), sort_keys=True), ), ] From 1b13e668225a3d44a5431640bfac69ec80fcc1a7 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 10:58:06 -0800 Subject: [PATCH 26/81] fix order of points in test --- tests/data/granule.umm_json | 84 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 91437206..d1103b0e 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -33,88 +33,88 @@ "Boundary": { "Points": [ { - "Longitude": 39.51836791663281, - "Latitude": 36.13651330232068 + "Latitude": 39.473041057707775, + "Longitude": 35.92252341193061 }, { - "Longitude": 40.43544809674256, - "Latitude": 36.002268874547816 + "Latitude": 38.962529726360856, + "Longitude": 35.99456687090555 }, { - "Longitude": 40.76274790474101, - "Latitude": 37.35838533475343 + "Latitude": 38.50873923689982, + "Longitude": 36.056646468363866 }, { - "Longitude": 40.75866504235371, - "Latitude": 37.35932440089175 + "Latitude": 38.49576709571327, + "Longitude": 35.997073364974284 }, { - "Longitude": 40.798970046585445, - "Latitude": 37.52515129358135 + "Latitude": 37.61699395524997, + "Longitude": 36.111618275866036 }, { - "Longitude": 39.83536427778569, - "Latitude": 37.672665438632244 + "Latitude": 37.65041435955687, + "Longitude": 36.27735285568951 }, { - "Longitude": 39.78819730789849, - "Latitude": 37.46875834003536 + "Latitude": 37.64814575242416, + "Longitude": 36.277943152074116 }, { - "Longitude": 39.791727200410456, - "Latitude": 37.46795488041173 + "Latitude": 37.92590907183943, + "Longitude": 37.643205847988945 }, { - "Longitude": 39.785100802645864, - "Latitude": 37.4391295264553 + "Latitude": 38.79164966112796, + "Longitude": 37.52454535929715 }, { - "Longitude": 39.29517709241584, - "Latitude": 37.510878013230325 + "Latitude": 38.80405309241584, + "Longitude": 37.580690013230324 }, { - "Longitude": 38.80405309241584, - "Latitude": 37.580690013230324 + "Latitude": 39.29517709241584, + "Longitude": 37.510878013230325 }, { - "Longitude": 38.79164966112796, - "Latitude": 37.52454535929715 + "Latitude": 39.785100802645864, + "Longitude": 37.4391295264553 }, { - "Longitude": 37.92590907183943, - "Latitude": 37.643205847988945 + "Latitude": 39.791727200410456, + "Longitude": 37.46795488041173 }, { - "Longitude": 37.64814575242416, - "Latitude": 36.277943152074116 + "Latitude": 39.78819730789849, + "Longitude": 37.46875834003536 }, { - "Longitude": 37.65041435955687, - "Latitude": 36.27735285568951 + "Latitude": 39.83536427778569, + "Longitude": 37.672665438632244 }, { - "Longitude": 37.61699395524997, - "Latitude": 36.111618275866036 + "Latitude": 40.798970046585445, + "Longitude": 37.52515129358135 }, { - "Longitude": 38.49576709571327, - "Latitude": 35.997073364974284 + "Latitude": 40.75866504235371, + "Longitude": 37.35932440089175 }, { - "Longitude": 38.50873923689982, - "Latitude": 36.056646468363866 + "Latitude": 40.76274790474101, + "Longitude": 37.35838533475343 }, { - "Longitude": 38.962529726360856, - "Latitude": 35.99456687090555 + "Latitude": 40.43544809674256, + "Longitude": 36.002268874547816 }, { - "Longitude": 39.473041057707775, - "Latitude": 35.92252341193061 + "Latitude": 39.51836791663281, + "Longitude": 36.13651330232068 }, { - "Longitude": 39.51836791663281, - "Latitude": 36.13651330232068 + "Latitude": 39.473041057707775, + "Longitude": 35.92252341193061 } ] } From 89cb4cdf6bbdf31e7cb412e7cec5d5055236810a Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 11:06:46 -0800 Subject: [PATCH 27/81] passing tests --- .../src/echo10_construction.py | 7 ++--- tests/test_echo10_construction.py | 27 ++++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index c4ddfaad..bfb3b021 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -45,11 +45,8 @@ def get_s3_file_size(obj): def get_sds_metadata(obj): - # content = get_file_content_from_s3(obj['Bucket'], obj['Key']) - content = pathlib.Path(__file__).parents[2].resolve() / 'tests/data/sds_metadata.json' - with open(content) as f: - sds_metadata = json.load(f) - return sds_metadata + content = get_file_content_from_s3(obj['Bucket'], obj['Key']) + return json.loads(content) def format_polygon_echo10(polygon): diff --git a/tests/test_echo10_construction.py b/tests/test_echo10_construction.py index 7b2181a8..6b0d1396 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_echo10_construction.py @@ -40,24 +40,27 @@ def test_get_s3_file_size(s3_stubber): assert echo10_construction.get_s3_file_size(obj) == 123 -def test_get_sds_metadata(test_data_dir, s3_stubber): - obj = { - 'Bucket': 'ingest-test-aux', - 'Key': 'S1-GUNW-D-R-059-tops-20201118_20201013-180252-00179W_00051N-PP-1ec8-v2_0_6.json' - } - - sds_metadata_file = test_data_dir / 'sds_metadata.json' - sds_metadata = json.loads(sds_metadata_file.read_text()) - - with sds_metadata_file.open() as f: - s3_stubber.add_response(method='get_object', expected_params=obj, service_response={'Body': f}) - assert echo10_construction.get_sds_metadata(obj) == sds_metadata +# def test_get_sds_metadata(test_data_dir, s3_stubber): +# obj = { +# 'Bucket': 'ingest-test-aux', +# 'Key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0' +# } +# +# sds_metadata_file = test_data_dir / 'sds_metadata.json' +# sds_metadata = json.loads(sds_metadata_file.read_text()) +# +# with sds_metadata_file.open() as f: +# s3_stubber.add_response(method='get_object', expected_params=obj, service_response={'Body': f}) +# assert echo10_construction.get_sds_metadata(obj) == sds_metadata def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): mocker.patch('echo10_construction.now', return_value='2024-03-02T22:12:36.000Z') mocker.patch('echo10_construction.upload_content_to_s3') + sds_metadata =json.loads((test_data_dir / 'sds_metadata.json').read_text()) + mocker.patch('echo10_construction.get_sds_metadata', return_value=sds_metadata) + echo10_s3_object = { 'bucket': 'ingest-test-aux', 'key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.umm_json', From 9b8f8482408671e9eb7b5a7fe2d203d52e2a2be0 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 11:07:12 -0800 Subject: [PATCH 28/81] uncomment passing test --- tests/test_echo10_construction.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/test_echo10_construction.py b/tests/test_echo10_construction.py index 6b0d1396..71174428 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_echo10_construction.py @@ -40,18 +40,18 @@ def test_get_s3_file_size(s3_stubber): assert echo10_construction.get_s3_file_size(obj) == 123 -# def test_get_sds_metadata(test_data_dir, s3_stubber): -# obj = { -# 'Bucket': 'ingest-test-aux', -# 'Key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0' -# } -# -# sds_metadata_file = test_data_dir / 'sds_metadata.json' -# sds_metadata = json.loads(sds_metadata_file.read_text()) -# -# with sds_metadata_file.open() as f: -# s3_stubber.add_response(method='get_object', expected_params=obj, service_response={'Body': f}) -# assert echo10_construction.get_sds_metadata(obj) == sds_metadata +def test_get_sds_metadata(test_data_dir, s3_stubber): + obj = { + 'Bucket': 'ingest-test-aux', + 'Key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0' + } + + sds_metadata_file = test_data_dir / 'sds_metadata.json' + sds_metadata = json.loads(sds_metadata_file.read_text()) + + with sds_metadata_file.open() as f: + s3_stubber.add_response(method='get_object', expected_params=obj, service_response={'Body': f}) + assert echo10_construction.get_sds_metadata(obj) == sds_metadata def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): From 6df3359ecd723d26cf5e2251e735341a7ee24ca4 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 11:59:44 -0800 Subject: [PATCH 29/81] collection version should be a string --- echo10-construction/src/echo10_construction.py | 2 +- tests/data/granule.umm_json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index bfb3b021..5d453a0a 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -71,7 +71,7 @@ def render_granule_metadata(sds_metadata, config) -> dict: "GranuleUR": granule_ur, "CollectionReference": { "ShortName": "ARIA_S1_GUNW", - "Version": 1 + "Version": "1" }, "RelatedUrls": [ { diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index d1103b0e..3bc287cb 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -7,7 +7,7 @@ "GranuleUR": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0", "CollectionReference": { "ShortName": "ARIA_S1_GUNW", - "Version": 1 + "Version": "1" }, "RelatedUrls": [ { From a8021fc85c6bac93c9c1e7b0254670d30cf4ebb5 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 12:11:46 -0800 Subject: [PATCH 30/81] minor code cleanup --- .../src/echo10_construction.py | 83 +++++++++---------- tests/data/config.json | 4 +- 2 files changed, 43 insertions(+), 44 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 5d453a0a..92db3624 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -1,6 +1,5 @@ import json import os -import pathlib from datetime import datetime from logging import getLogger @@ -49,7 +48,7 @@ def get_sds_metadata(obj): return json.loads(content) -def format_polygon_echo10(polygon): +def format_polygon(polygon): coordinates = [] for lat, long in polygon: coordinates.append({"Latitude": lat, "Longitude": long}) @@ -58,60 +57,60 @@ def format_polygon_echo10(polygon): def render_granule_metadata(sds_metadata, config) -> dict: granule_ur = sds_metadata['label'] - download_url = config['granule_data']['download_path'][:-3] - browse_url = config['granule_data']['browse_path'][:-3] - polygon = format_polygon_echo10(sds_metadata['location']['coordinates'][0]) + download_url = config['granule_data']['download_path'] + browse_url = config['granule_data']['browse_path'] + polygon = format_polygon(sds_metadata['location']['coordinates'][0]) return { - "MetadataSpecification": { - "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", - "Name": "UMM-G", - "Version": "1.6.5" + 'MetadataSpecification': { + 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5', + 'Name': 'UMM-G', + 'Version': '1.6.5', }, - "GranuleUR": granule_ur, - "CollectionReference": { - "ShortName": "ARIA_S1_GUNW", - "Version": "1" + 'GranuleUR': granule_ur, + 'CollectionReference': { + 'ShortName': 'ARIA_S1_GUNW', + 'Version': '1', }, - "RelatedUrls": [ + 'RelatedUrls': [ { - "URL": f'{download_url}{granule_ur}.nc', - "Type": "GET DATA" + 'URL': f'{download_url}{granule_ur}.nc', + 'Type': 'GET DATA', }, { - "URL": f'{browse_url}{granule_ur}.png', - "Type": "GET RELATED VISUALIZATION" - } + 'URL': f'{browse_url}{granule_ur}.png', + 'Type': 'GET RELATED VISUALIZATION', + }, ], - "TemporalExtent": { - "RangeDateTime": { - "BeginningDateTime": sds_metadata['metadata']['sensing_start'], - "EndingDateTime": sds_metadata['metadata']['sensing_stop'] - } + 'TemporalExtent': { + 'RangeDateTime': { + 'BeginningDateTime': sds_metadata['metadata']['sensing_start'], + 'EndingDateTime': sds_metadata['metadata']['sensing_stop'], + }, }, - "SpatialExtent": { - "HorizontalSpatialDomain": { - "Geometry": { - "GPolygons": [ + 'SpatialExtent': { + 'HorizontalSpatialDomain': { + 'Geometry': { + 'GPolygons': [ { - "Boundary": { - "Points": polygon - } - } - ] - } - } + 'Boundary': { + 'Points': polygon, + }, + }, + ], + }, + }, }, - "ProviderDates": [ + 'ProviderDates': [ { - "Date": now(), - "Type": "Insert" + 'Date': now(), + 'Type': 'Insert', }, { - "Date": now(), - "Type": "Update" - } - ] + 'Date': now(), + 'Type': 'Update', + }, + ], } diff --git a/tests/data/config.json b/tests/data/config.json index e92fdbcc..d9ebd41b 100644 --- a/tests/data/config.json +++ b/tests/data/config.json @@ -1,7 +1,7 @@ { "output_bucket": "ingest-test-aux", "granule_data": { - "download_path": "https://grfn-test.asf.alaska.edu/door/download/{0}", - "browse_path": "https://grfn-public-test.asf.alaska.edu/{0}" + "download_path": "https://grfn-test.asf.alaska.edu/door/download/", + "browse_path": "https://grfn-public-test.asf.alaska.edu/" } } From 007f23c65613402408d6e77794c7083ebf6dd039 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 12:22:13 -0800 Subject: [PATCH 31/81] remove unused config parameters from echo10_construction cloudformation --- cloudformation.yaml | 4 -- echo10-construction/cloudformation.yaml | 57 +------------------ .../src/echo10_construction.py | 4 +- tests/data/config.json | 4 +- 4 files changed, 7 insertions(+), 62 deletions(-) diff --git a/cloudformation.yaml b/cloudformation.yaml index dd769b47..a365a19c 100644 --- a/cloudformation.yaml +++ b/cloudformation.yaml @@ -14,9 +14,6 @@ Parameters: BrowseBaseUrl: Type: String - ReformatApiUrl: - Type: String - DefaultResponseTopicArn: Type: String @@ -109,7 +106,6 @@ Resources: AuxBucket: !Ref AuxBucket DistributionBaseUrl: !Ref DistributionBaseUrl BrowseBaseUrl: !Ref BrowseBaseUrl - ReformatApiUrl: !Ref ReformatApiUrl TemplateURL: echo10-construction/cloudformation.yaml CmrTokenStack: diff --git a/echo10-construction/cloudformation.yaml b/echo10-construction/cloudformation.yaml index 68d1a2b2..cb06cb6c 100644 --- a/echo10-construction/cloudformation.yaml +++ b/echo10-construction/cloudformation.yaml @@ -20,9 +20,6 @@ Parameters: BrowseBaseUrl: Type: String - ReformatApiUrl: - Type: String - Outputs: LambdaArn: @@ -77,58 +74,10 @@ Resources: CONFIG: !Sub |- { "output_bucket": "${AuxBucket}", - "api_url": "${ReformatApiUrl}", "granule_data": { - "download_path": "${DistributionBaseUrl}/{0}", - "browse_path": "${BrowseBaseUrl}/{0}", - "missions": [ - {"name": "S1 I-grams (BETA) - Kilauea Volcano, HI", "coords": [[-159,16],[-150,16],[-150,23],[-159,23]]}, - {"name": "S1 I-grams (BETA) - Northern CA", "coords": [[-126,38.4],[-116,38.4],[-116,42],[-126,42]]}, - {"name": "S1 I-grams (BETA) - Central CA", "coords": [[-126,37],[-116,37],[-116,38.4],[-126,38.4]]}, - {"name": "S1 I-grams (BETA) - Southern CA", "coords": [[-123,30],[-114,30],[-114,37],[-123,37]]}, - {"name": "S1 I-grams (BETA) - Other", "coords": [[-180,-90],[180,-90],[180,90],[-180,90]]} - ], - "collection": { - "dataset_id": "Sentinel-1 Interferograms", - "processing_type": "GUNW_STD", - "processing_type_display": "Standard Product, NetCDF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - } - }, - "derived_products": [ - { - "label": "unwrappedPhase", - "layer": "science/grids/data/unwrappedPhase", - "dataset_id": "Sentinel-1 Interferograms - Unwrapped Phase", - "processing_type": "GUNW_UNW", - "processing_type_display": "Unwrapped Phase, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, - { - "label": "coherence", - "layer": "science/grids/data/coherence", - "dataset_id": "Sentinel-1 Interferograms - Coherence", - "processing_type": "GUNW_COH", - "processing_type_display": "Coherence, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, - { - "label": "amplitude", - "layer": "science/grids/data/amplitude", - "dataset_id": "Sentinel-1 Interferograms - Amplitude", - "processing_type": "GUNW_AMP", - "processing_type_display": "Amplitude, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - }, - { - "label": "connectedComponents", - "layer": "science/grids/data/connectedComponents", - "dataset_id": "Sentinel-1 Interferograms - Connected Components", - "processing_type": "GUNW_CON", - "processing_type_display": "Connected Components, GeoTIFF", - "processing_description": "Sentinel-1 SLC interferometric products generated by JPL using ISCE v2.0.0, delivered by ASF" - } - ] + "download_path": "${DistributionBaseUrl}", + "browse_path": "${BrowseBaseUrl}" + } } Handler: echo10_construction.lambda_handler MemorySize: 128 diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 92db3624..4cc0e423 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -74,11 +74,11 @@ def render_granule_metadata(sds_metadata, config) -> dict: }, 'RelatedUrls': [ { - 'URL': f'{download_url}{granule_ur}.nc', + 'URL': f'{download_url}/{granule_ur}.nc', 'Type': 'GET DATA', }, { - 'URL': f'{browse_url}{granule_ur}.png', + 'URL': f'{browse_url}/{granule_ur}.png', 'Type': 'GET RELATED VISUALIZATION', }, ], diff --git a/tests/data/config.json b/tests/data/config.json index d9ebd41b..bcdf5ba8 100644 --- a/tests/data/config.json +++ b/tests/data/config.json @@ -1,7 +1,7 @@ { "output_bucket": "ingest-test-aux", "granule_data": { - "download_path": "https://grfn-test.asf.alaska.edu/door/download/", - "browse_path": "https://grfn-public-test.asf.alaska.edu/" + "download_path": "https://grfn-test.asf.alaska.edu/door/download", + "browse_path": "https://grfn-public-test.asf.alaska.edu" } } From 12045b229a6024d6f603a08b7f4ecfb6a537dee4 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 13:16:02 -0800 Subject: [PATCH 32/81] remove obsolete shapely and jinja2 requirements for echo10-construction --- echo10-to-cmr/src/cmr.py | 44 ++++++++++------------------ requirements-echo10-construction.txt | 2 -- 2 files changed, 15 insertions(+), 31 deletions(-) diff --git a/echo10-to-cmr/src/cmr.py b/echo10-to-cmr/src/cmr.py index b7dc246a..90abfaa4 100644 --- a/echo10-to-cmr/src/cmr.py +++ b/echo10-to-cmr/src/cmr.py @@ -2,9 +2,9 @@ # https://wiki.earthdata.nasa.gov/display/CMR/CMR+Data+Partner+User+Guide # https://cmr.earthdata.nasa.gov/ingest/site/ingest_api_docs.html#create-update-granule +import json from logging import getLogger from urllib.parse import urljoin -from xml.etree import ElementTree import boto3 import requests @@ -12,18 +12,20 @@ log = getLogger() -def send_request(session, base_url, echo10_content): - granule_native_id = get_granule_native_id(echo10_content) +def send_request(session, base_url, metadata_content): + metadata = json.loads(metadata_content) + granule_native_id = metadata['GranuleUR'] + content_type = f'pplication/vnd.nasa.cmr.umm+json;version={metadata["MetadataSpecification"]["Version"]}' url = urljoin(base_url, granule_native_id) - response = session.put(url, data=echo10_content) + response = session.put(url, headers={'Content-Type': content_type}, data=metadata_content) log.info('Response text: %s', response.text) - return response + return response.json() def get_session(config, s3): token = get_cached_token(config, s3) session = requests.Session() - headers = {'Content-Type': 'application/echo10+xml', 'Authorization': token} + headers = {'Accept': 'application/json', 'Authorization': token} session.headers.update(headers) return session @@ -42,36 +44,20 @@ def get_cached_token(config, s3): return None -def get_granule_native_id(echo10_content): - xml_element_tree = ElementTree.fromstring(echo10_content) - granule_name = xml_element_tree.find('GranuleUR').text - return granule_name - - -def push_echo10_granule_to_cmr(session, echo10_content, config, s3): - response = send_request(session, config['granule_url'], echo10_content) +def push_granule_metadata_to_cmr(session, metadata_content, config, s3): + response = send_request(session, config['granule_url'], metadata_content) if response.status_code == 401: lamb = boto3.client('lambda') lamb.invoke(FunctionName=config['cmr_token_lambda']) token = get_cached_token(config['cached_token'], s3) session.headers.update({'Authorization': token}) - response = send_request(session, config['granule_url'], echo10_content) + response = send_request(session, config['granule_url'], metadata_content) response.raise_for_status() return response -def get_granule_concept_id(response_text): - root = ElementTree.fromstring(response_text) - granule_concept_id = root.find('concept-id').text - return granule_concept_id - - def process_task(task_input, config, session, s3): - granule_concept_ids = [] - for echo10_object in task_input: - log.info(echo10_object) - echo10_content = get_file_content_from_s3(echo10_object['bucket'], echo10_object['key'], s3) - response = push_echo10_granule_to_cmr(session, echo10_content, config, s3) - granule_concept_ids.append(get_granule_concept_id(response.text)) - - return granule_concept_ids + log.info(task_input) + metadata_content = get_file_content_from_s3(task_input['bucket'], task_input['key'], s3) + response = push_granule_metadata_to_cmr(session, metadata_content, config, s3) + return response['concept-id'] diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index 8caa93f8..19d4b3ec 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1 @@ boto3==1.34.54 -Jinja2==3.1.3 -shapely==2.0.3 From 8bc9b9cdafeffb303e490a12757eabfec823c921 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 13:20:54 -0800 Subject: [PATCH 33/81] fix typo in content type --- echo10-to-cmr/src/cmr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/echo10-to-cmr/src/cmr.py b/echo10-to-cmr/src/cmr.py index 90abfaa4..6e70d5d2 100644 --- a/echo10-to-cmr/src/cmr.py +++ b/echo10-to-cmr/src/cmr.py @@ -15,7 +15,7 @@ def send_request(session, base_url, metadata_content): metadata = json.loads(metadata_content) granule_native_id = metadata['GranuleUR'] - content_type = f'pplication/vnd.nasa.cmr.umm+json;version={metadata["MetadataSpecification"]["Version"]}' + content_type = f'application/vnd.nasa.cmr.umm+json;version={metadata["MetadataSpecification"]["Version"]}' url = urljoin(base_url, granule_native_id) response = session.put(url, headers={'Content-Type': content_type}, data=metadata_content) log.info('Response text: %s', response.text) From aa4e7fd38ae4f1ed01831df7657c3b729e96cc4c Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Mon, 18 Mar 2024 13:32:49 -0800 Subject: [PATCH 34/81] update CHANGElog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d3a26aaf..819c8d9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [PEP 440](https://www.python.org/dev/peps/pep-0440/) and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.2.2] +### Changed +- `echo10_construction.py` is updated to support the latest version of GUNW products. + ## [1.2.1] ### Changed - Upgraded Python and GitHub Action dependencies. From bbbac44bcf6061bf747877d64725ca604d6a4381 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 14:02:05 -0800 Subject: [PATCH 35/81] fix response bug in echo10-to-cmr --- echo10-to-cmr/src/cmr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/echo10-to-cmr/src/cmr.py b/echo10-to-cmr/src/cmr.py index 6e70d5d2..92005879 100644 --- a/echo10-to-cmr/src/cmr.py +++ b/echo10-to-cmr/src/cmr.py @@ -19,7 +19,7 @@ def send_request(session, base_url, metadata_content): url = urljoin(base_url, granule_native_id) response = session.put(url, headers={'Content-Type': content_type}, data=metadata_content) log.info('Response text: %s', response.text) - return response.json() + return response def get_session(config, s3): @@ -53,7 +53,7 @@ def push_granule_metadata_to_cmr(session, metadata_content, config, s3): session.headers.update({'Authorization': token}) response = send_request(session, config['granule_url'], metadata_content) response.raise_for_status() - return response + return response.json() def process_task(task_input, config, session, s3): From 907e8ec5222b08aa8a8fca153dab9ac268168f21 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 18 Mar 2024 14:24:36 -0800 Subject: [PATCH 36/81] fix long vs lat and polygon winding order --- .../src/echo10_construction.py | 2 +- tests/data/granule.umm_json | 84 +++++++++---------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 4cc0e423..04886f9a 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -50,7 +50,7 @@ def get_sds_metadata(obj): def format_polygon(polygon): coordinates = [] - for lat, long in polygon: + for long, lat in reversed(polygon): coordinates.append({"Latitude": lat, "Longitude": long}) return coordinates diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 3bc287cb..82be0cb8 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -33,88 +33,88 @@ "Boundary": { "Points": [ { - "Latitude": 39.473041057707775, - "Longitude": 35.92252341193061 + "Latitude": 35.92252341193061, + "Longitude": 39.473041057707775 }, { - "Latitude": 38.962529726360856, - "Longitude": 35.99456687090555 + "Latitude": 36.13651330232068, + "Longitude": 39.51836791663281 }, { - "Latitude": 38.50873923689982, - "Longitude": 36.056646468363866 + "Latitude": 36.002268874547816, + "Longitude": 40.43544809674256 }, { - "Latitude": 38.49576709571327, - "Longitude": 35.997073364974284 + "Latitude": 37.35838533475343, + "Longitude": 40.76274790474101 }, { - "Latitude": 37.61699395524997, - "Longitude": 36.111618275866036 + "Latitude": 37.35932440089175, + "Longitude": 40.75866504235371 }, { - "Latitude": 37.65041435955687, - "Longitude": 36.27735285568951 + "Latitude": 37.52515129358135, + "Longitude": 40.798970046585445 }, { - "Latitude": 37.64814575242416, - "Longitude": 36.277943152074116 + "Latitude": 37.672665438632244, + "Longitude": 39.83536427778569 }, { - "Latitude": 37.92590907183943, - "Longitude": 37.643205847988945 + "Latitude": 37.46875834003536, + "Longitude": 39.78819730789849 }, { - "Latitude": 38.79164966112796, - "Longitude": 37.52454535929715 + "Latitude": 37.46795488041173, + "Longitude": 39.791727200410456 }, { - "Latitude": 38.80405309241584, - "Longitude": 37.580690013230324 + "Latitude": 37.4391295264553, + "Longitude": 39.785100802645864 }, { - "Latitude": 39.29517709241584, - "Longitude": 37.510878013230325 + "Latitude": 37.510878013230325, + "Longitude": 39.29517709241584 }, { - "Latitude": 39.785100802645864, - "Longitude": 37.4391295264553 + "Latitude": 37.580690013230324, + "Longitude": 38.80405309241584 }, { - "Latitude": 39.791727200410456, - "Longitude": 37.46795488041173 + "Latitude": 37.52454535929715, + "Longitude": 38.79164966112796 }, { - "Latitude": 39.78819730789849, - "Longitude": 37.46875834003536 + "Latitude": 37.643205847988945, + "Longitude": 37.92590907183943 }, { - "Latitude": 39.83536427778569, - "Longitude": 37.672665438632244 + "Latitude": 36.277943152074116, + "Longitude": 37.64814575242416 }, { - "Latitude": 40.798970046585445, - "Longitude": 37.52515129358135 + "Latitude": 36.27735285568951, + "Longitude": 37.65041435955687 }, { - "Latitude": 40.75866504235371, - "Longitude": 37.35932440089175 + "Latitude": 36.111618275866036, + "Longitude": 37.61699395524997 }, { - "Latitude": 40.76274790474101, - "Longitude": 37.35838533475343 + "Latitude": 35.997073364974284, + "Longitude": 38.49576709571327 }, { - "Latitude": 40.43544809674256, - "Longitude": 36.002268874547816 + "Latitude": 36.056646468363866, + "Longitude": 38.50873923689982 }, { - "Latitude": 39.51836791663281, - "Longitude": 36.13651330232068 + "Latitude": 35.99456687090555, + "Longitude": 38.962529726360856 }, { - "Latitude": 39.473041057707775, - "Longitude": 35.92252341193061 + "Latitude": 35.92252341193061, + "Longitude": 39.473041057707775 } ] } From e3c7a66fdb2ef959e8ab09f552eb8d0f5e852026 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:06:15 +0000 Subject: [PATCH 37/81] Bump boto3 from 1.34.64 to 1.34.65 Bumps [boto3](https://github.com/boto/boto3) from 1.34.64 to 1.34.65. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.64...1.34.65) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-echo10-construction.txt | 2 +- requirements-echo10-to-cmr.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index d6c17baf..580069d3 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.64 +boto3==1.34.65 requests-pkcs12==1.24 diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index ab0fe999..0ec3c4f1 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ -boto3==1.34.64 +boto3==1.34.65 Jinja2==3.1.3 shapely==2.0.3 diff --git a/requirements-echo10-to-cmr.txt b/requirements-echo10-to-cmr.txt index 015017b3..3c69a571 100644 --- a/requirements-echo10-to-cmr.txt +++ b/requirements-echo10-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.64 +boto3==1.34.65 requests==2.31.0 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index d77cfb82..8614c7db 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.64 +boto3==1.34.65 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index d77cfb82..8614c7db 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.64 +boto3==1.34.65 diff --git a/requirements-notify.txt b/requirements-notify.txt index d77cfb82..8614c7db 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.64 +boto3==1.34.65 diff --git a/requirements-verify.txt b/requirements-verify.txt index b0bd3e02..162e738b 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.64 +boto3==1.34.65 jsonschema==4.21.1 From 615df1076f1a9c513f8e0cb0dba56974e0eb87c3 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 19 Mar 2024 15:37:20 -0800 Subject: [PATCH 38/81] rename echo10 to metadata --- Makefile | 4 +-- cloudformation.yaml | 8 +++--- .../cloudformation.yaml | 2 +- .../src/metadata_construction.py | 6 ++-- ...ction.py => test_metadata_construction.py} | 28 +++++++++---------- 5 files changed, 24 insertions(+), 24 deletions(-) rename {echo10-construction => metadata-construction}/cloudformation.yaml (97%) rename echo10-construction/src/echo10_construction.py => metadata-construction/src/metadata_construction.py (95%) rename tests/{test_echo10_construction.py => test_metadata_construction.py} (63%) diff --git a/Makefile b/Makefile index d83e769c..0e92b408 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -ECHO10_CONSTRUCTION = ${PWD}/echo10-construction/src/ +METADATA_CONSTRUCTION = ${PWD}/metadata-construction/src/ VERIFY = ${PWD}/verify/src/ -export PYTHONPATH = ${ECHO10_CONSTRUCTION}:${VERIFY} +export PYTHONPATH = ${METADATA_CONSTRUCTION}:${VERIFY} export CONFIG = "{}" test_file ?= tests/ diff --git a/cloudformation.yaml b/cloudformation.yaml index a365a19c..bb5b1685 100644 --- a/cloudformation.yaml +++ b/cloudformation.yaml @@ -76,7 +76,7 @@ Resources: VerifyLambdaArn: !GetAtt VerifyStack.Outputs.LambdaArn NotifyLambdaArn: !GetAtt NotifyStack.Outputs.LambdaArn IngestLambdaArn: !GetAtt IngestStack.Outputs.LambdaArn - Echo10ConstructionLambdaArn: !GetAtt Echo10ConstructionStack.Outputs.LambdaArn + MetadataConstructionLambdaArn: !GetAtt MetadataConstructionStack.Outputs.LambdaArn TemplateURL: step-function/cloudformation.yaml InvokeStack: @@ -96,17 +96,17 @@ Resources: Name: !Sub "${AWS::StackName}-verify" TemplateURL: verify/cloudformation.yaml - Echo10ConstructionStack: + MetadataConstructionStack: Type: AWS::CloudFormation::Stack Properties: Parameters: - Name: !Sub "${AWS::StackName}-echo10-construction" + Name: !Sub "${AWS::StackName}-metadata-construction" PrivateBucket: !Ref PrivateBucket PublicBucket: !Ref PublicBucket AuxBucket: !Ref AuxBucket DistributionBaseUrl: !Ref DistributionBaseUrl BrowseBaseUrl: !Ref BrowseBaseUrl - TemplateURL: echo10-construction/cloudformation.yaml + TemplateURL: metadata-construction/cloudformation.yaml CmrTokenStack: Type: AWS::CloudFormation::Stack diff --git a/echo10-construction/cloudformation.yaml b/metadata-construction/cloudformation.yaml similarity index 97% rename from echo10-construction/cloudformation.yaml rename to metadata-construction/cloudformation.yaml index cb06cb6c..46eccdc6 100644 --- a/echo10-construction/cloudformation.yaml +++ b/metadata-construction/cloudformation.yaml @@ -79,7 +79,7 @@ Resources: "browse_path": "${BrowseBaseUrl}" } } - Handler: echo10_construction.lambda_handler + Handler: metadata_construction.lambda_handler MemorySize: 128 Role: !GetAtt Role.Arn Runtime: python3.8 diff --git a/echo10-construction/src/echo10_construction.py b/metadata-construction/src/metadata_construction.py similarity index 95% rename from echo10-construction/src/echo10_construction.py rename to metadata-construction/src/metadata_construction.py index 04886f9a..db572d6e 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -114,8 +114,8 @@ def render_granule_metadata(sds_metadata, config) -> dict: } -def create_granule_echo10_in_s3(inputs, config): - log.info('Creating echo10 file for %s', inputs['Product']['Key']) +def create_granule_metadata_in_s3(inputs, config): + log.info('Creating metadata file for %s', inputs['Product']['Key']) sds_metadata = get_sds_metadata(inputs['Metadata']) umm_json = render_granule_metadata(sds_metadata, config) output_location = { @@ -128,5 +128,5 @@ def create_granule_echo10_in_s3(inputs, config): def lambda_handler(event, context): - output = create_granule_echo10_in_s3(event, CONFIG) + output = create_granule_metadata_in_s3(event, CONFIG) return output diff --git a/tests/test_echo10_construction.py b/tests/test_metadata_construction.py similarity index 63% rename from tests/test_echo10_construction.py rename to tests/test_metadata_construction.py index 71174428..d16e47ce 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_metadata_construction.py @@ -5,12 +5,12 @@ import pytest from botocore.stub import Stubber -import echo10_construction +import metadata_construction @pytest.fixture def s3_stubber(): - with Stubber(echo10_construction.s3.meta.client) as stubber: + with Stubber(metadata_construction.s3.meta.client) as stubber: yield stubber stubber.assert_no_pending_responses() @@ -21,12 +21,12 @@ def test_get_file_content_from_s3(s3_stubber): expected_params={'Bucket': 'myBucket', 'Key': 'myKey'}, service_response={'Body': io.StringIO('myContent')} ) - assert echo10_construction.get_file_content_from_s3('myBucket', 'myKey') == 'myContent' + assert metadata_construction.get_file_content_from_s3('myBucket', 'myKey') == 'myContent' def test_write_to_file(tmp_path): target = tmp_path / 'foo.txt' - echo10_construction.write_to_file(str(target), 'hello world') + metadata_construction.write_to_file(str(target), 'hello world') assert target.exists() assert target.read_text() == 'hello world' @@ -37,7 +37,7 @@ def test_get_s3_file_size(s3_stubber): 'Key': 'myKey' } s3_stubber.add_response(method='head_object', expected_params=obj, service_response={'ContentLength': 123}) - assert echo10_construction.get_s3_file_size(obj) == 123 + assert metadata_construction.get_s3_file_size(obj) == 123 def test_get_sds_metadata(test_data_dir, s3_stubber): @@ -51,26 +51,26 @@ def test_get_sds_metadata(test_data_dir, s3_stubber): with sds_metadata_file.open() as f: s3_stubber.add_response(method='get_object', expected_params=obj, service_response={'Body': f}) - assert echo10_construction.get_sds_metadata(obj) == sds_metadata + assert metadata_construction.get_sds_metadata(obj) == sds_metadata -def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): - mocker.patch('echo10_construction.now', return_value='2024-03-02T22:12:36.000Z') - mocker.patch('echo10_construction.upload_content_to_s3') +def test_create_granule_metadata_in_s3(test_data_dir, inputs, config, mocker): + mocker.patch('metadata_construction.now', return_value='2024-03-02T22:12:36.000Z') + mocker.patch('metadata_construction.upload_content_to_s3') sds_metadata =json.loads((test_data_dir / 'sds_metadata.json').read_text()) - mocker.patch('echo10_construction.get_sds_metadata', return_value=sds_metadata) + mocker.patch('metadata_construction.get_sds_metadata', return_value=sds_metadata) - echo10_s3_object = { + metadata_s3_object = { 'bucket': 'ingest-test-aux', 'key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.umm_json', } - assert echo10_construction.create_granule_echo10_in_s3(inputs, config) == echo10_s3_object + assert metadata_construction.create_granule_metadata_in_s3(inputs, config) == metadata_s3_object - assert echo10_construction.upload_content_to_s3.mock_calls == [ + assert metadata_construction.upload_content_to_s3.mock_calls == [ unittest.mock.call( - echo10_s3_object, + metadata_s3_object, json.dumps(json.loads((test_data_dir / 'granule.umm_json').read_text()), sort_keys=True), ), ] From ed586d248252919328fa53fc24c9991bec5e387c Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 19 Mar 2024 15:45:50 -0800 Subject: [PATCH 39/81] rename metadata-to-cmr --- cloudformation.yaml | 6 +++--- {echo10-to-cmr => metadata-to-cmr}/cloudformation.yaml | 0 {echo10-to-cmr => metadata-to-cmr}/src/cmr.py | 0 {echo10-to-cmr => metadata-to-cmr}/src/daemon.py | 0 step-function/cloudformation.yaml | 8 ++++---- step-function/step-function.json | 10 +++++----- 6 files changed, 12 insertions(+), 12 deletions(-) rename {echo10-to-cmr => metadata-to-cmr}/cloudformation.yaml (100%) rename {echo10-to-cmr => metadata-to-cmr}/src/cmr.py (100%) rename {echo10-to-cmr => metadata-to-cmr}/src/daemon.py (100%) diff --git a/cloudformation.yaml b/cloudformation.yaml index bb5b1685..2916516e 100644 --- a/cloudformation.yaml +++ b/cloudformation.yaml @@ -118,17 +118,17 @@ Resources: CertificateSecretArn: !Ref LaunchpadCertificateSecretArn TemplateURL: cmr-token/cloudformation.yaml - Echo10ToCmrStack: + MetadataToCmrStack: Type: AWS::CloudFormation::Stack Properties: Parameters: - Name: !Sub "${AWS::StackName}-echo10-to-cmr" + Name: !Sub "${AWS::StackName}-metadata-to-cmr" ActivityArn: !GetAtt StepFunctionStack.Outputs.CmrActivityArn AuxBucket: !Ref AuxBucket CachedCmrTokenKey: !Ref CachedCmrTokenKey CmrTokenLambda: !GetAtt CmrTokenStack.Outputs.LambdaName CmrGranuleUrl: !Sub "${CmrBaseUrl}/ingest/providers/${CmrProvider}/granules/" - TemplateURL: echo10-to-cmr/cloudformation.yaml + TemplateURL: metadata-to-cmr/cloudformation.yaml NotifyStack: Type: AWS::CloudFormation::Stack diff --git a/echo10-to-cmr/cloudformation.yaml b/metadata-to-cmr/cloudformation.yaml similarity index 100% rename from echo10-to-cmr/cloudformation.yaml rename to metadata-to-cmr/cloudformation.yaml diff --git a/echo10-to-cmr/src/cmr.py b/metadata-to-cmr/src/cmr.py similarity index 100% rename from echo10-to-cmr/src/cmr.py rename to metadata-to-cmr/src/cmr.py diff --git a/echo10-to-cmr/src/daemon.py b/metadata-to-cmr/src/daemon.py similarity index 100% rename from echo10-to-cmr/src/daemon.py rename to metadata-to-cmr/src/daemon.py diff --git a/step-function/cloudformation.yaml b/step-function/cloudformation.yaml index 0dccd213..6fd28963 100644 --- a/step-function/cloudformation.yaml +++ b/step-function/cloudformation.yaml @@ -14,7 +14,7 @@ Parameters: NotifyLambdaArn: Type: String - Echo10ConstructionLambdaArn: + MetadataConstructionLambdaArn: Type: String Outputs: @@ -30,7 +30,7 @@ Resources: CmrActivity: Type: AWS::StepFunctions::Activity Properties: - Name: !Sub "${Name}-echo10-to-cmr" + Name: !Sub "${Name}-metadata-to-cmr" Role: Type: AWS::IAM::Role @@ -54,7 +54,7 @@ Resources: - !Ref VerifyLambdaArn - !Ref IngestLambdaArn - !Ref NotifyLambdaArn - - !Ref Echo10ConstructionLambdaArn + - !Ref MetadataConstructionLambdaArn StepFunction: Type: AWS::StepFunctions::StateMachine @@ -65,6 +65,6 @@ Resources: DefinitionSubstitutions: VerifyLambdaArn: !Ref VerifyLambdaArn IngestLambdaArn: !Ref IngestLambdaArn - Echo10ConstructionLambdaArn: !Ref Echo10ConstructionLambdaArn + MetadataConstructionLambdaArn: !Ref MetadataConstructionLambdaArn CmrActivity: !Ref CmrActivity NotifyLambdaArn: !Ref NotifyLambdaArn diff --git a/step-function/step-function.json b/step-function/step-function.json index 343b6283..89b1b553 100644 --- a/step-function/step-function.json +++ b/step-function/step-function.json @@ -35,7 +35,7 @@ "Type": "Task", "Resource": "${IngestLambdaArn}", "ResultPath": "$.IngestResults", - "Next": "Echo10Construction", + "Next": "MetadataConstruction", "Retry": [ { "ErrorEquals": [ @@ -53,12 +53,12 @@ } ] }, - "Echo10Construction": { + "MetadataConstruction": { "Type": "Task", - "Resource": "${Echo10ConstructionLambdaArn}", + "Resource": "${MetadataConstructionLambdaArn}", "InputPath": "$.IngestResults", "ResultPath": "$.ConstructionResults", - "Next": "Echo10ToCMR", + "Next": "MetadataToCMR", "Retry": [ { "ErrorEquals": [ @@ -76,7 +76,7 @@ } ] }, - "Echo10ToCMR": { + "MetadataToCMR": { "Type": "Task", "Resource": "${CmrActivity}", "TimeoutSeconds": 30, From 5fcaade5395dfd4d38e75ab3e1053db0508001c0 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 19 Mar 2024 16:19:30 -0800 Subject: [PATCH 40/81] andrew's fixes --- .github/workflows/deploy.yml | 4 ++-- .github/workflows/static_analysis.yml | 2 +- README.md | 4 ++-- requirements-all.txt | 4 ++-- ...construction.txt => requirements-metadata-construction.txt | 0 ...ents-echo10-to-cmr.txt => requirements-metadata-to-cmr.txt | 0 6 files changed, 7 insertions(+), 7 deletions(-) rename requirements-echo10-construction.txt => requirements-metadata-construction.txt (100%) rename requirements-echo10-to-cmr.txt => requirements-metadata-to-cmr.txt (100%) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c8277acc..12a9dc1a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -57,8 +57,8 @@ jobs: python -m pip install -r requirements-verify.txt -t verify/src/ python -m pip install -r requirements-ingest.txt -t ingest/src/ python -m pip install -r requirements-notify.txt -t notify/src/ - python -m pip install -r requirements-echo10-to-cmr.txt -t echo10-to-cmr/src/ - python -m pip install -r requirements-echo10-construction.txt -t echo10-construction/src/ + python -m pip install -r requirements-metadata-to-cmr.txt -t metadata-to-cmr/src/ + python -m pip install -r requirements-metadata-construction.txt -t metadata-construction/src/ # crytography on AWS Lambda requires manylinux2014 per https://github.com/ASFHyP3/hyp3/issues/1190 python -m pip install -r requirements-cmr-token.txt --platform manylinux2014_x86_64 --only-binary=:all: -t cmr-token/src/ - name: package and deploy diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml index a63d974b..530bb608 100644 --- a/.github/workflows/static_analysis.yml +++ b/.github/workflows/static_analysis.yml @@ -17,7 +17,7 @@ jobs: - run: | python -m pip install --upgrade pip python -m pip install flake8 flake8-import-order flake8-builtins # FIXME add flake8-blind-except - - run: flake8 --max-line-length=120 --import-order-style=pycharm --statistics --application-import-names echo10_construction verify + - run: flake8 --max-line-length=120 --import-order-style=pycharm --statistics --application-import-names metadata_construction verify cfn-lint: runs-on: ubuntu-latest diff --git a/README.md b/README.md index 4a2f07b1..3ed5f489 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,9 @@ data. * **step-function:** A step function defining the workflow to ingest a single GRFN data product. * **verify:** A Lambda function that validates the received message as well as the files and metadata in the source S3 bucket. * **ingest:** A Lambda function that copies product files from the source S3 bucket to the output S3 buckets. -* **echo10-construction:** A Lambda function that generates an ECHO 10 XML metadata file for a particular product. +* **metadata-construction:** A Lambda function that generates an ECHO 10 XML metadata file for a particular product. * **cmr-token** A Lambda function that generates an access token for the CMR ingest API. -* **echo10-to-cmr:** A scheduled Lambda function that submits ECHO 10 XML metadata files to CMR. +* **metadata-to-cmr:** A scheduled Lambda function that submits ECHO 10 XML metadata files to CMR. * **notify:** A Lambda function that sends ingest success/failure messages to the SNS response topic. # Top Level Inputs and Outputs diff --git a/requirements-all.txt b/requirements-all.txt index 207655b7..a132abc7 100644 --- a/requirements-all.txt +++ b/requirements-all.txt @@ -1,6 +1,6 @@ -r requirements-cmr-token.txt --r requirements-echo10-construction.txt --r requirements-echo10-to-cmr.txt +-r requirements-metadata-construction.txt +-r requirements-metadata-to-cmr.txt -r requirements-ingest.txt -r requirements-invoke.txt -r requirements-notify.txt diff --git a/requirements-echo10-construction.txt b/requirements-metadata-construction.txt similarity index 100% rename from requirements-echo10-construction.txt rename to requirements-metadata-construction.txt diff --git a/requirements-echo10-to-cmr.txt b/requirements-metadata-to-cmr.txt similarity index 100% rename from requirements-echo10-to-cmr.txt rename to requirements-metadata-to-cmr.txt From 1456bd993cdc9c24ad8b5a41eba3b0da67e30ff3 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Tue, 19 Mar 2024 16:23:51 -0800 Subject: [PATCH 41/81] update readme architecture diagram --- doc/architecture.png | Bin 176668 -> 204167 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/architecture.png b/doc/architecture.png index fbf095bb3c3baddf6bfa2cf9c8aa2eeb5f287091..549ce0d79ff48f49f7128a0746fafe98dbe00812 100644 GIT binary patch literal 204167 zcmeFZX&}_=8#k`gX``aDRKii#gb=cg(vc)2BxV@0CF|HG%a~3@%2u|qPqJkjvd!2= z$C`CSmSLDJ^iXcyspS*@|99kg@kQPvgGW#7p%q$cEWXZArD!dNoO{u-R<{S!@p=!TIW?QAR23wxFIvXGE94*iZ0uR*SwtTu|;qnEb$qbp8M_KpJ{E|{vRJI}=$xKpJ z&QMu75tSEHlLPB`cOWRjtA0+lnNLi%RcqKZQe!4ET0Ft?;e#9g-5G+vKCY_v{S&7q za*953Dlcm50U)$$i{>lYM)zEvp|}?Fg^}6_*nn!uJu^h>VuUyAKZ0Kr>uVe->hBmI zzU(-aub_G<0~FZZ1<37W;I;RB^K=~g=GykOdxC1ogF@!iil z`DgV64fY2{&y5JLJU@YnjP}HF71SO9ii(4K7kkm&TorRKO@p3MrSAzY%MQU(S-<`I zT=tv2&}xpKTcYGID$nPZ@rB}OQ+aplM@~y=$Heptgwe^da&;4uF(&;L=DCQ4Wiwg7N=uQzV)Fi-34?K-mRWYMw zAR2xO!O>fC_I&f2leJZ(t7l;i24S+6NAoBo4Ve}E`bpiJvlp7za)X+2e4F=4FP8=* zam&~LvlW&1^yye@dDeZRAo3#pm42syc{C(o@lcQ>qy0QZ2Lc}%Ef|zF){6w2Rl2oM zI+QHrFmi`p!hUU_ky~+a$l5Jck*PfsJpabin)v8rvCK$;2ZVTcpyoboAit1*xle)i<`P~3Qt zJ3(Obu3W*^=dlQ%1Edi}yO_p>U*`Mp^?hfg()sa=>c_o z!By08w@>bGh|z%mRA9}EqdI#w=v!XXlzHPy`F!=>@L#$volNGZw`|4QVJ1wcOEMH3 zyMh3$U|zSkdX}m<-|nU++s(yKQLJ7RjLTrP68Q*D1f^cLB^`+8cOyo?+!HMF&b7)y z&D0cs`sV5iQIvzDX}l)s6;!dSdt*516QFVH6d@pvWaXNz{cqu@TzrTgrCweGz$dlN zwN{$L0o9)R5leqemtW)H2-8A-rdaFdmd>ujYWQ@K)|{Ld!!)USl^CT%nu&`(iLDDdKTxoQl?S}5L)YB?KkjSuOg`i8 zdTX+X2x28tIt#BdxoXmo9>9Fp#*c6b#<9!n`zV9Vq`ckr)#R2Q0AaiAOpn3YZSTm` z%7broUKjQFU@6%DJ{Y#fxO)MkN$&wRC}SM_d4$J%9soJQLNG6~MtSCavg!3=G_ZPa zRVL4nWP^>@XJ)8#6c{a=?U==bZLu81zbh!OFJ_JsgMR7PcW%w<$lI!(;{l~*svUDIOx}v}E z)K*6Md^4XpFXiV?-r%f{mtSni{&?v>e}62Lwrk6i>p*(iiap!^j>p2xB>cO5{JlUL zzjN3Q)AihsxtfK`6i79HPjecV(L%p*T%@v{yPmHYyu9__ornM4r1EfZ4Evwvqr5!N z`72a7!1*Skn0Ie^4*Zm-G~xf!Pg)k+6jWzWyvYCzy?v?kJ=2yxrT-_)u4JmIX;z3q zkI>^fdS6jf#z6P}E8K^pJMnjb`I{UOxyoqqsKzyPB&rl1^@dEpfP{Wy;3diu>ai; z_&fDd)f-;bH{Ot48;Hv``;iM1ry>+~1nHR|7o%}UuFdpM4y3Q4TH5ajubro6n9 zggSFFC9bA7CGCV&ESM#YKO%Lu14dQ8?|dX6orN_ zKGBI&`AMUcYD{D&y*AIq`c-^RLmqMRmuSp`vh8T5v_$=|rjU>B1EZq^yiLKbar&&o z4e}}$rCZ!@_>_5NRfv(firb@>7oe>r8Y`A$1YuV4xziGTrrBQj%Phmm)KajI+&}1G z(zO!>ZP0Lvp{o7d!&a|SG51`9gOZN=aSQTqcRcTg4o)pz8HT@7znO6IZ1oVIXpt{!j0&o zK5-WQo=d0H+yE!ZKB6DvYGicOAa<;5cFB0x%#I(qU_Np6HAtvcETNg)unF7D>NU-! zvT6sAAt)`$Z#w?qv;oB7V>{10W|oSOY+`jS)%4$?!sN4em8SSP6lXXmtcFoO6(`@B&eyQ*4;ep3hs?k|udWYwzhI%7 zeGr!}+*t4Q_<p8t+)0(x*|@YXTu z?xosJU7uK#Q_QJ%yAgTwJugKihXsd)+&P9^0-Ztb%rsBGAR<&GFG-^1HrVx&xoWwf zE(4pmF@bMK8x~#sx(h%bO8Kl}-)E{N^Pyas(uHd?I4TT$zCwa5b(!3+V3B>U-H|bR z`kOiK%Qx5GTZS_VLbju_Ek)?5Npp4~-VRoZ-NIZyUGi`l?O0h#+z#MK1eWyLDoWm& z@Lrs3De+8fi-0Qr40SlKZ)w?PDDSMUWFhdphkB zp#{Q6rzL5XwH-b1O=IafJSaZ7n>NBJadDJ}tbGdHt8`DL9YrpXW{Sc9zv2FF4 zhNiTs9OB~7gOw`(Pc{=gV;6Ggb@I%{k^=Ndcl#GA{@V{fy!uYGY(B9~1or&1c|<@eQD(oK9b%NuSRHs$CBH#S5f30i?ygirznj-CBX%GPO!< z7cN(F`7XRWc;fAp`!bomn$)mPzxAd2nw>|P#rnOUnjQAgF(?BLjQ?az6z@(c{Ug5z z`1t3^qiD0&3|3ww1u+9aX$fN@KfkI}P1GgtlXV^(q8&I~f~o0UfRC{?K&!I#g1 zB)7F{g@1lg710|TEC(Fk5jQwBWM`vzwpM#A6o*M_yPpvqU?l4Cu^i;&4piVLV4GN= zl&5w7%dl)Ej{_b*uEqDT>flh^zHeqf83+`@D{O#)_W(TaGdE#pISW{VA#OZ<%J;1kZL8?yeEc?#@EThebL}&2?h~%<3uOyGy?Yo|f6j@#<(+y^Rv)abi*vqj)J-$kk@J*7Omp|BJ?Ka{a=_0< zsXmx(EPwg(mT%89uYT(C#1Q>x5S}-WNA;i8=&kjsl@@a(P>8L~Zm_ighRD7o2Tqj7 zY&VaQi;C(NQuP`(2NO*h2ldMg)-!HzQIuv1dX;qPk~-JQg8VhUsj#a zh>UYV=$l>I+|xY8n$siEAony${gNP+0NnJl%%ypIa?!fT(7ABEPt9zxzq`4dU{Db4;;FGNi>x>+hi;ipEgwCVw9upV#eFDUqY6f>wij8DZO+-8OMBY1NKWDf3d2xs#AK2e zz3yD&z^uq=xzxMM%~a!Pn*pHQWGm%HGQki~z<9jL!YnT@rOzJtz+Y0x1)~}oS~dX* z2YDECwL`8bbWx`~F zAs})rL~Ez?Yeb3AX^+i$(FqH>gulR4AVE2e3kV_)D8$eEB6HN}+y#CA2trCs%T|uD zC`QsabY{xH&Tb`^`u>{>l*S2`?P4592AsXRva;Y5FKeSx@8<3)O$(#TG!_>>7vTT< zt~?a7Hs@PWG(MSVD6%%=*xweiIWjkyVWpmxcf;axAH*}n*Ct?N?8&(d?V*cu&BcIU z)_=_qPsj-!ib=nggsPLMknp)?P=-O@fuu|;=sCvx$`N6=uU#u!sD#RCdlOg7TuT;C zNqda>DRm6)?E3v^j$WQ_sjn~25pE5mZWHa1k33p5DBJY=89n?Hob)(LzOi#3b6UzO zc;Ep|8@tZ;oNgq-=aeyyU9GBiE72jntSZo>_`R$3(Pw867e4fytB|nQ@$tT<9g5pc zg(m?R$k6%)nJ3R0Bz|66Z%Vdrlhc4xQHe$(LH%Vuox*h}h|yaKhuQ>?fm*d( z=O7{GsD&*mXEs3y=Nm}G_Mf!|&?NN{hBjx~?{cqyt8Vk-S9bFAXPvp`&murdDqSFZ z-=wt{pT@+icdJLwG{yO9w__e}LUHT5TJ0F5i6x{GBqx9cS`Qb4_6)0q&Sc9~h!rxW zTXN4H?SEq5V^ROvScM>)pq{JZL&hQu5p9>#J8Mva29=T!QPAqZSQyZ1giPXI zI?hJd!hq|p-4gO%K zE@riJ^ie}J&@&p_?6z-ociAkS4*yE$;y$9P615~8iedO+JkJbSM++9cri_f9Z)mu` zoNYox3*NE2swfI-*d8_(r7b7LQn!DqmHJ_q`(=t(%g%@_FI)p~Mi`S0t{JNAZ_6lk z3$$$WQ)0@uw5(0!`AGO0r>4lJ%R(WQa&pLk*;uAl5Ft4l^evEbW)roNgpu89%bH3Z zwR)+Y85*e-VkrJuW?c_|9y2+KdpvOMSv?ohMv4~=4SF^+Ma2c@zTtsC^w<6=i@z<9 zpbY_8%HLdB!Iu6Z-AQZv>gCt;tiB}GWPRMRzjHf9_T8F9NL0mKN_CzZ}47_#k#ZnW;&=WF3(hD=E_&jm6 zwD)-zQf*W`iL3A703mlVkp+}KD_FNv{Uw?x99F{n>s363SpO7=`G$pc$ z3eC`$)_trXzs_g%C?oB6ZgY`k#x|<;)Pe=)MD3N@!6p&#c5w&6A%++)?z26e0~iRQ z>J)JkhOH9D>zd{Pd6w71>#3wNa8))hW0Ky{+A*#f|Z`8QFRB0xELo?X;2WJ6v zrz=q*RuWTPZ+r@)=3;*NzH3f{hIWdYKeg|aqidp}JkWt_a6jLWfxL%fz3ethuL;?F zTR@P9nr$+vu8p=Y34hnyhk(CAAOiGEYRFFyk6|eq$DZlRC+!ya5 zWBE?mRGam$WvBMav{;ib%WW+$=!LH9B3^oFS(**t-xfc-fAC0%HZfPnX9cryAy|d( z1`(kr|EN5G<=vd;4%%djZ|VY0T~#VZl&#fvivoBAHmARh-Bvbdzw>%mVAbvn9vaT= z4p|X$i}iNi#}gVqD#=nWl?A||emQx=7d`9XYT(IRM}W#2t`bS4w}vUm@BF>`blq~~UdTrPZV^sEv|D^vJwP>NFSM{7?&{*$ zf_e;o3auf?WI#c6{9bj?dfi3d#wXbT$3k|-Q!=6m1coDH-%lO+%hg`6ywfl`aOA`~ z{(a`wfPtVMt#&o7jIoO&RKNn;Gc|LLG0&UO~rC0xiJg zlT0IYjS4_Z<$o?aI*4oymTGwR_P9=&fqEdR@<>j}mR(blD*G$x=~0_N58|Bm!!y_o zc(ESIzfCndpA&0zF-LyX+A1U>;JoQemTM9!@+0kgKSH+)AdD9ysfzZkk*c>+RTi~# zjnV_#1#%5p?G@#O?G}L^5DTUFHGAm7OjvoIk$cq83K_JsNobI(uOdctmzK#%Orbd3 za)3HfLt7DICrw-T(qDP`!vk+;2m9krM5u$paBSuQ<({zT1ufi{jAKhF&x6lTp~YDlvhFOBYdhEP*?L!|) z|63S!ypOk`E)#UOUJ^@iUq<9CE&UZ|G{Wj(GPNdIf!G zSt@XswyF6-3IpqF)WgOX%E68GtT8f9eh@gaYp(*g-=Mkn85D9M4MM*Gf9Mm_vb1B8 z^oTkM+cfLaRtk7q?mQaCmV}G!FlatGv&Dr0xU5-a;mCkLGF<(bAj(i7WyRP!&PRJG z4Z?2PU{5dCLx#;$S&j4U%BJeBuJh`~AX<2ktIvU=5W;)UYAk-n{3?3S@Seq$(DEL2 z{}H0|&V`x$q&0=B`^D!fgU`-{x%B4>#n~)STb%FV#GLFx4tbl+{p)V~%g&vyX=p3iIga9Pole0)gpo8T+^EM| zuwm!=mKtHMpm_7aP*6;_UwWD#`-6T$iADV0uwvj03*G&>hPCt5eA9kKNL8=+)3^#= z#$s4ln5tumc1vE+&4v<5&ySb`wqDJ%RAB{RstuHVJ3SsE;TN?7?EQtl+4Kr>+m{5B zU${IyywX!MKVt4z?P6W&vgZOLE=hYv&pb#9`p7`fX+f^GrHByU>B-`Dhd8(u- zYwn%T^64DMY7L5VO?A1-5PwN$HH_T=PlG5gFXg4J%=h-%4vM_lKumB!H%eTb(e;5T zuP3S;2aSQ?9Dh`-om9Wg3-sgCPFlrQD!`uuoW&8l_u^%W&-z-X+9{N^HV@E+Iu)ZO z`y(Iz!3Wx!K>2<)7alZ8WjPE@k#f@gs-ga$rxW2Z>xo7hBc>c+aPzr3_a#k%@~U!Y z^&!2 z=@J)=mk)Bq&I4Jj+?KPUr#Fp?9^-zzC<#g>3)8)VK_aPRyEj#U-ffx=f^A^YP*Rg! zUNzsKu~5(;>=Wb+__?<3m$=Q>z5c7m$W?xQ3n>1B{jntSeOg3yVR==cew%c)l7{4v z83_!fpWmnUM(S3o`r7k;0HKmYI3bGRYC-d#^Cl~|jnCIJx3b&Cc}VP3P6o^3iYQ^W*fk4ke>uS98R`U)Fxg=y?EK zN($w$Z?ohWw=D=2c^#hD;#SqQ6Xb=*1yP+8Z>zScf)_H{UX3z>RVzxOj|JREKIeD# zWT^YOSA7tFnvrLZN7Zk;A?M-|nc@LrreQ%U7$g)(qBdzjqe>EFkK_f4k;TwwgHwWl z94AD@Y8|lO8IuOym$z)7Qdtr{I3qWglvb+*ZDl%ZJIbD-_EaiS4AkYk+m*u6lb>~`*9ET}?aCw)xd@!!W%;$oVe z7kw1C8i!(s9I*^Z8ms-u?CR1_B?yh~l}xXIJG;~N0)FDEKJQ&vJMSF>H^c^5QY0r=wjY&*^Z_0e1bzG_mx;}Q9%i)!pEBy1nkVZpFzue zEUufH;!If~So>8kXpq6?L)#hWps(xOIG*md*xvG3{HbHGG6Qr1<0n$$$^kBMaf3ql z-`OCso&Q$az-FRd%qDBFZJKETHmVLkn#2B@+-aBWmU`N&W8k|{uzo9|2Jbm>GwfPT zo@sHXpFbYUOf&ZzSQ;kT9^#Ns(ILIk6~)|mmN>Ph0C(u%bLr`%rK-x#L~M$4JQV}M z^PDo81P!xJ1BK@cGI?Y+U@Wap`$zlxV7NwLoiS}87t;Z};L2uA^5)RXS2d20Cl&j}I|7Y<*x^xF0O}- znw0M*Bg6HKy@yYK^DdG}2Qel!4j6!+!un&a;;!C7)Nf%akt=?V^lS;)iP# zN2|>IfKFe8(&+yAE{7&H8!6+d7-HhhxG1Pny-lfg^DG_9l>XpIe?k2|*8UJZ+xV3G zp3k*z(W}xPZ8xpLSj6S$p$10`w7otQ=ae z7Tz1KbH+{NfVg0XjVrM8XIowhD1B8H?|y!#OQc*j=iJ~J$_)pSCqGg;oW6@n6=E@~ zrcXv+%}fpd+CDG8&Y`>R+R?+>1!`iXpqu9C`w52|vZq_Y(Wxi#A;VuTItSfvl2tmiHDBa;CN<@dKGog5~P1`u^f9tul_ zfzfKJxlT=(z5WnDf`$&ag-X|3ax>JVi2L}HbbR*CCsKz!2!Q1sHuye>Pf2o4n#?u` zL1eDZ-i#rBW@)R>6eU$FpkJujPIg~>1ax8n&KJezo#@ki?LiR!4&Ky9DIEqLo&{3+ z5vCI|C)T;SjtT)KPzn$2vP-Os*>nBAIg|dgq$A4D!#vM`B)Xy)3bJZ5OA8%8q7{5y z^k`UmHy_16X7gcJjYAWt-cqFhba@*+$P*G?t1yGzM`q0QCCN%t>u!sB_;xMolZW)_ zsH90%>d0cpRu#H!%em{s=28&-Q6D`eRJhwSNTPhZQbD`JQ>M#DK}2?#d%yVuqjhfC zc5Rk)GaK}yx+t|z(ZXj}VtIyAs}G3q$R%Gs4>7kq=7AV`ZI_d87NH2l@N?}t*1OW8 zKpproIiYEJ?eiphvbD(y`~Q@^?-(Hvo8wqo@#lK#6F-;JXmZdba3Lwfh?&>}N+Tox zP_YOPvhPCENBc-3$E6xc`}HNQKZv)(4alZe^9BvuK_SG{=W$VbD4@k&EPD@S zl?X-8pcNW!1>Sr#$8g`r`uh!+Z2RXBPFTp&H?Ogkgk242e{IMo&h2CXn>%Pfcf(%x zdGz6knDboP7`01V%gtF$^&PNL<+*o=xr!=nE&ux)wCokH^g<9i#V2I|A)oyVMtiRUij+@={KhvA)rj4?J|@ z1dmJd*TnkN4g;ffa}(weKC~bMauI(ic=4aTHJug_F{cGFg`mq@>(+WycBvA)mn z4!W+(0jGRJj4P7X8HC<$V#hZe0iP0(4j2ymRjgrL7u;2KK){(ZqdTrg2*D z3@`t!Gej-%c?*en56tgFL1=Z#ijpB8t3E4Jk*F2av}gbBmCYGKssO(75p1IejxXQE z_*rXT6ZC?@V}SLP0i}WK1ASUor10uw>BRtjf3iTkNM+M#E+|3zA5jyBVqZ2kZ^>u$Vr4B26%hMelGy=joVUb>zd+que#oD)1jkzm* z4a(;6MFjrhGW`h4IVs1vFEE#@wAiNW&s+4Ok62hlacgUN+-JOVT9mX13o^=|&zM&N zZ;d4PA1i6ASLmEv)6aX$-c2>Gg_6(2^%6oum({CU7Xm(s9tbOGT^QZ*eTRr0FYz_Q z=_*JDFZRAJalH|1y;M{p@`d9Z2iU`v3w8v$b$??8h3D>pWX&*vqYS&NOZW5BXr%{KsQ_nXe%54$;VwGmKV`hfxZ;R40 z9h%m$&QPuOgDqn)V(P1ZQ_2OzLv-QUut9{L?g(@$gwjpx_ zRN^=-n4mBLUjh}>Zunc%{-M1l_suy6b$Ze#*J{50!>%nMb477rO#*3zYleL1@LG9q zr^r3%+g6I$3g42|5KMka$bu(1z-;=u>KWUM?(U*SRhKzoPsM~pfy)rwYo=kWag~!o z(G#9-Wtqd3!0|%?Kf?lkRv3F^G)V8pC`43F=>1~#R+X<>FQo@im&-&kW5+IDA_!mM zHB?(%{!L?OnPGqZznMUok=siQCbho|V{}}-?+3REY_q=ivHZOvVuTqlf?NwxzJtai zC2;GeB!!?J(7P%3^7Gd}Uowvm$zS%y;Ya`bberDg>QTJu7 z+^h+(p?B(0$%+%QLC?jA;`Psw`5N2Zh4Tfe6lE>frm_7e9lmq!s{rRN zNYVptQKZC$+UdjpIvD7;b2VW#o){Qm4R;?-3(mG>%f}vJ<&E>uABBLejt3z^5OzS+ zzK-fFG0y47tb5b~+T_}e@4~&{UK!jvp|B=6X1HXJUCj0kgw`nYRTa1HI8e*3&QAcWv z9UGr%&D@R0+xfSIOgcr8m!Qt(@xhgV@>R=au4@vFuewIW@lW^Nxu?GPP`vV_qat>aUVdHNV3J=hWy#{vs|f4Bjij$@ zzVX->=O$UgMD}(+`W!nT(7@l3*W1LoN!91*>jfKh`iO*Y+W*b$4CKC{BG;UwAK{>Mzvo3j znJv3weD8i+AP*Z0xEVlY*dPQq6iCqehC_K-pM(a3u9U$<na(K zvv+hz?;M)K;VymjZHqp7`L;6gQHS};WPQJ6>qad+aZ?-7 zx%@om99oNLZb2Uf`g;V>9Voq^5pg=!VW`5_&!%N`-23Y0_H?;Kc%E3j3gxB&EfF{7%y_N|T}-M!iA z0bGOoly`6l0H9!hWVn&Oid<-pCBWaNIde?^0;R5wVO6nhb?ck;s&dU^x4-(?jo90a z2Yujh!|-7By1F;rQ*Zi9O*HC|$eeh&E+S!REUQ5W@-Q$2fs{Uz5Pi1lZLxO?px!@# z`OyK&3bKrG=v!b64+E*)IPV-9*v5ZgI%Dx&H*k;IGkkM+xBqZ@enIuTwX#?{W-h(} zs^L4eFcT>+?S2}nn3-QU6;GT#hd;tnq2ux?^xIPDsx~FYixD1Xes&qe860I2;;LbqcysQ#G+_z`Oi*~ z3UI;d_2{{e0RYgMh3~COFP3eV1=n0EqRn%1YpwPgC184bzBajH=Dt-xxMH3eG5I61 z?Xe(TT%tqz9DO*_ceNZXskN`9qRvmRtHGn9ZGYVTLR00WcunY$B|?G1Da#(vzg6j}o4 zxYl0oMZozTc0tni_1v3!F$U0`+%D$l=dn?GUA5X0?8()rPz{qhplKuf;|BFbo^qL+ zpkyP1nu4mDT3!_JP9>sKIlXc~)o)>!O`ScezNcjOQ8~ir*n+F zb)T7yw@n==ulp2qrH43qQ>O2&o#!68sXU$Tn|e=ck=}+aKxcaA#L|%YGN?F`K?PdR zb6U5SW)tE%`b}sv4l(;qUfL~xrxU@Arp8)){wl_r%YWkLa#NX*m_2`rdT@pAYXw^}C)w`=mN!dzT1J%J*TNXCXviQ%z3;WAY}Zl8a+k_H7) ztm#M9{vZYPDG-30ju9{+zX4z@VNMoqu&Jx5nn9{dSQysPHzv89k@LHBk^NS|-Ud`y zG!-Qfzf`-_1|Hk2lR z1F{NzocL8gpxwuiFUPpKL?ql&xMAC`f8&@%ONl_&Y3;X}`S*AFoh%}gNI+m`TTU`$ zYX5n)_j(%gBi=Jbf(M!P^kDs8Qi)=#DG~Jen7;g3~AL zFt!$oQB**tQ?1%h<%dQ0TXq2G7v%9q;gDuSKcb{*X4Luw&|+co5+w7-5N z^0A^)wLF^lC`m>>Vv%0fH)lbHEAT%U~&XAR>nLf)S^7BQ7 zo94h^rZ5Y`6q)12vPp%sE!vn~Xau+5+D6(_1LK|y0oz`wX7^K}xXcq)as2?th2~_n zIx_aEyya=T{y!17yX^pgZczE+l-@kE$`?gT!0^i1!kQ+ZuGR0m{np2O4c`BRG~eEa zM|Mv^h$+k_XbK{|JKs2Vtnbq&{<}0*ERb32s83c9(DZ0IRcF#3PeZ+=1-bYr8KF2M z$-wcAzNVDcsLK!UwuGlt{Hf}?6(ZR!Ew2?YxDh*|#+M_KY;CjhiDnj=(e~NXq8qx&|ib^l;hUXqwzolzcJ|nS6CNVG;gMQQ2NbD)=r_ z9-53JgQD!o+bLl{9Axm1Q@jb{YillZ?s4bvj=LUNPb=&eDh>3e#Xqtpyd2tCiLRMP zx0Wo;zv~3x98H28!dz4p(om>4qrMVNTn==E9{8n4;1+fw4Ilx)y-rEuTWzELpJMDi zy5uv55wdgAO}#BtfgV47+P@ng^VjZm z#%rHG5IF&7B9_Z~gR* z|CX};?Xb+h!TQ(^cv*5S8+Zj(|K{!L)9&Zd5G12L0nuR&PF@2hg2up9L3ln5QeFVe zAi>Vo-SU$)g_BkL(w7YLz{SaZCSV`$wy8-8ObFCZ-+64=6Az#sbksU&^ktc)!a-5$ z@t(_eCDEqmp<^b{&Do!l-t#MX)x0W-6q|gim<8Y3plDj|f9e zBDIZHui|SBx4MVFJT!Y|RN_a%YXaUSJ-=ZEsSe~&54}w3xAfr4 zh0F;YL}*Ahrc>MRv-wT|FuX168A%Zbn)k9WglU(hLS9Kh;kKC|URX2f3S+BA)bUTitIwpPpD#7){HX0S3wCdYA1tv0+k zV$6IgU;QhdY2OKqwx7d4&x{ils+nxS3xFGxo)CBl$vGsL?5<#7A2P0{#(2I#9~Ww% zQRNN}P75#I()&ExXhNW zJOn8>oo10)HV@ogesGhC1tA6242q+v<2FC#uJziI-Iyt|-M^jn9#n+b!iV&H^2tDg z%FfbOAnR{HgP>*Gdwy#Nm}+|FkAl0q?bzi62kyB^V&0B0tu~RywCz`Xn|EsT>z6C>6_Wo~-f_3NGwabh&pT<=m!dQOncGnysqyAeno#PtjG8fG5ASVplYzlOm z8Sj3al{de7mlX+XQ&zzJQD_T-rHBAGNzPi>oWC%sp@{a9~UEOAvKGaEqfBdU6MS`lKcq+G_@LN+ez|9>Z zvUpGeRdyn)EAZz7rT(Zsl{m+~#Kc@ja>`x)s~OtwJ{CNA!o|IDB|djwS;g-oJ-5J|?=I~7 z{k7rm$6o9H?jYN%6Y&wxd1)?#ytCyr6RY9u(RU%PU2L-sTC(KYQ9nDbPkZ1!+oL)g zi;qJ&-AY)HjCOIkaAc@kdTi2_=6ZxfO;=RT^VHYS%P&%2HFwpoFWV=3z9g-2JSJuF z41xZAyT^-pXkYa%;xN(KqrKNSL*4Dp-S(HO>6)tUWfxAV7F6TKeDC<_K9Xcq?th&2 zmIsABJgk#;K^c6LwAGc{e!VZ?NfcK~0iWJ~qQf^TbU#r$$_b#d$ z%JrPLe2tIOUIa_fJD+P0-?q9mf-ibX8anlTCl;;N7_{}zUdwW)?#CUhr3QHh$;Wtb z`OB64W}-$Ervv&)5!A`BqO)ldb{?++W(sNkfX?3jugl1#_iWl{9pc!y5yf>VWX0D=Dd|V}t}&eQvJA<^psl#ZOcH)gF`Z{?Ru# zyMiq!GnGZhA?Is?Yifl!-ZUloEY6~Lc$bq)|@Pt~k%y2O>gyqo=%e&0L?qUQ0r zCXDh{X_l9JyN-2w@0A{t@P#v+F!wl|+J~9^$H&uhTO^$5YH$sXD+J)R>VFMhcU2(f z(9&IzLk+Cnzb4B&cGnyh4Kg^ZzH&`gZfgH_1+DWxR!DDleqR43@asQ|^9DNHTkp%n3f*)$wHY*lgngeTjBV~{Rt)3Q z080pPct`6%W^adgiXHNK-Q3*@tUYrs)hFkZ+k(eXn_KDY)pH!H(!7)ry-82$^silg^jja7K<8aMKlKnBw0E(W6ZW@W3)(VO0_>MRs< zG#klJNlbAU^VnXLX&Spg@AiV9;dlf0&E>&T!k)(ER86a%iLdma&pC(U7FJnmcWsym z^Fe&Az`xPx`}dn&51L7QHncPO&mqeknLD@uO7DxZclW2lMq)*uTYNK5<8N1DzC0AA z#YV^{cFNb@0vhG2Z{Cv2LzZZOBQqUEjr2)r7Y@<6Egwi!FK}?w7Xt4VP@W*2@eqo4 zz*4e|!?!E1*x;u>7O~-4{|45Vm#topMwzj_N^m3D?(^2K z8@t&D%sxI@nUEh!cy@EK^YTZ8^`19+zLh+B>gn6yaPY$_U(_BB&TDx9RG*Pvl4n_$ zea_XrD4SPpKVq~4G}XUut(DoWfmeFsme2I?{%hdJn0tZo#4@~C-3B~pNxbm4mloMy z-<2s}W9IeS4AhR2nzIc5+)S!c)( zw7PxbIfOnL6a7k{@O*g(uzwlg1=apbpZf0cWAcSgFw6dxz(Ld~F=#se#i?vlK`27UbG{#7!< zbftV6XDM~a2aC`&OiFMCAF5S&Ro%J%o0 z!)V~-r8rhka>4=({^q4Pyxx4PrLWeLk$s`kGF|TPYPHW}M>%>KzSTT=Rx0f^JDAuZ z+77wsJ#mg4ikm755ZTci55`?jl-Ihru&FNm%LgCh4Jk8+Q;*CM5_Y5y`QV$o?!h6( zNqlT3>h#Spyw_65^mlo_et;d1iQa%;Yk#Fbkl-Z4So{64@HHUo%vJ7Yh|%E_uV1W- zOnh@8oWO9Wp$#pBIxqGz7xvS7kE+N#Zz>INgGhgA%cokkOc&ty~-ogCJo(Nu} z)wOD$hxuLdBI~ni;@9+EDgbbEf+O&7D6UStB=mC7+hb*$m113p_4jITz7F0^B&InV z+wQLgT8XP#V{*+dM~WP?iUN?yb>6f3mZKF;fACVo0%VBFOWN`!V@RVFS3fkIp84yY z`xg<1jLop-Zu>oGHCIr4(q^$(mx4bjnpR~k-s)x|atK}d?tb5m-!y_RaSXVboD4GLxQW@ zg9cK+=6otu@KlYl{ak6Kv51QFH*pAtsTVAwMJnxp%x`*HrctB1M4V$)YS*DqoIuhI zw!WX+HRGj~>@|ed1+Vu7lKoW$soUEU>L(ziNH45z;t`1ekA&dgAA`g#LN5=L!P1LD z=;*SQLHn{Qq1&OC9UJfio|p}iP3Gf+NFK|BINj%nR42_ ziikKX4#ZtKF4)7#nwU8IG6UPaMLd%EPu>Vepgb~OuWh;Ktwdoj!1L zN_eIwr#4#Xl$o53Rb)``tv?9JW8lqSlS=l|{dNDr+5eBKFOP?^{o)?=l&7>(RFW1; z2o=V@w8%~ovR4>c#>7~%juxqekag@?vS%H}R4D%zF(zzxRFbe|+jw z?&~_|T<3hx_ndRxgY#BlxRm^M^)Q=)u(Gzx$IIr6y-c{A>IFmnEp-)6`%}Cr&ZQnh zw+$Z3Z706(OzMy-h^I>Zx1);DYMPt)Fq>yRiwI+Bu9?T&#&BPS(&;tV(sv zcxCH+ut1AY=hI@>i2bGs2n3s~<>m67yI`EtSXk6N#J4C?vX^|{I`$`b*gFHt^nIc9 zMq^f30N(gH*&V%JQ;|bl@_d1zW$zdUc1S0c4*91IL<-tmOEeQcUzJuaYHp)<9&Au= zpl>48t4`G%-(I^qk%%bCy#k?tTAG{MI+KF~GM~D|0BMgiK09g%g?}Nt#)s=-P)hk$ zeqG11?izPVYc-*E9gB(fRaukv@{)Wt9AjYVd4$0z(wZ0AiVH^B%>B|``;ldS_eA(6 ztYl{~n+V@4&jWqEED;{A|;JS$rk7ti(tWL3&k{VV{MV#Y#g?3P<;9Ij+~Iq zY*2-Bao$!)qMum!2_uZ%zPjt$-lmO5RxEU3Lr(H-B&Tr^6RwSF24De_t2L|9c)P`Q&SqDG=F<* zry$OCrSZ-cA=n8Av&l7OvS7D(gnlRn(O31)XEZVt<=aJ2!Q$v2EN|IZM2aD&=j_ZRE3Ii&S=O8o<#)7$Hv!uqGdD z@m#j@#(cRXYG_vH6WC!u1k9uKo7hk88t%miN$Kz=aZ;sCzl=j#uvUtYxztv7;U7cI zvbJ3+A_Uuz*R<v ze2&18Fg^AHUtmG|O35lJH3%x*v6SoH)kd{!Dh?$T{3yuY>s=p{#N}!Jw9Yd?4Jo;G;+>iE8pXobP_l=GuIN;a-(nZ?`=?A zODG&95Pf}tc=Hd`0R{zAfRByj1Z((82R!R`-&754rqJ@jC${(Zwz{{sac8%&L?+8k zXR2iYPLl=(F%bY|Y+1d{Dj8|dnw&9SHv6!`)h1i`b6elrqLzn6BA*7L&tl~Zk!Fmh<+YVYNVER+Yg_z#$>VM#!J`hRjvh*0q%1A^%x1|3 zv#Nv*UMe*EeH7=jUph@uV!8*Uny(HnL=}W-D1O7p@|FhA36-ZBj-kXZcg{LheUY z=xpP&3)eww|uI+=&}f_l7U5 zILY~%e3;Flm|elLNewh3nMICt93Wj~aasS*cgU*bs;RbIym|zgT7#QdTe7Ea82&73 zF`m?=8lx~lRRwMG&E&__Ax6UI5OBxY`s@v-{2Du}s)+gnm2JEs1yf>?m-rNG)m({* za?GYK>y;A*DK|Pj+=cnqKTTka7``lP{?gN?~9#>?*_A=l$n*pMrntTae8*+2ffA`T3 zlBQGQ`A*J7R#;VirsojNQ044SUD=ppHvME>P0Y-VmEg(zs^~6^iqXEh(&R_%c*s0@ za)f~bpst%5!M6m2XIZ{iO_GnW)f|4N1%9~Uy~rBNS0iZV{xbh*@o3%e{9d>m$dT4Z zopnN~t;Cj>rdzI8TCb_KOoCJxGbtjEDQ$#>A>+FA9+dqzQ{@vF;tNYo{)7f?zI zy*M;V2{V9oEl0t6@@K~!OA9?P%-<=vH*5o*KeCs}bE z-x1CK^^jqJ?V&Z+fVZZ#W2ITR8m6%j(IM|Cgi4Sqym>MV7X*33;5p z@a}F2*vwBtyeeOVs+FkO*j8A&Z_zayfhPlG=RE-TQiKwp()N&&{?ycwagp> znF3gS9?*HNDlJ?GgzQp;>}y*plE4shn`aM5{`MY)XUZhS=dVAi+K|O}K2ziw`lwQ9 zHn@F$dU&MdZOJPtMffH!dkUxFhfIOdXl z{}~!>eH!8pI_Aq$%zaDd3`TqVErGcLBzJm`s>wlsC^;wDY0JP?HfZU03?*;ZyIU-*a)W9XZc zie88BS|C3X`%bUj8kgfdT&(us_^yqY$`p?A#Kj2R&a0cv-~8qTnFJn`>$CF>2%8#W zi>Oi{RzCu*>BjhJ}kIyUFy~7&yqozf;6Qw(2dV{HndV9$8 z7ZE@d`s0%moQVUN_C!cYl;9C$yq7V@OOu>yn+n>YepBACh65t~UP3>Mk{$oJI0v`O zqP~CL6Ug%9PLrkg<{zcW@MGt{Ve*~Lc=v5Yt)9uD2iOTs^(rjT6=>&&!ShAS1ic6AP??OxFwePUC~`mVBUeYBUkHafd7#xBq%sQ^a_AnUZkHG4xt)8kL7id z$#;K*7r;;+)bFk_^?J=JVr|>n6^*ouYn90T6t##o|BKrTH8OB|AvamL>{~-4OZ()Y z((#rqT!?!)_j60UI5_{P`L=kq99-rp-xzK}tvJn>q-O;`!2EYkh{m+Zs zRvG-NT)o{*cA+k69XM)_ZWe*&QRWbe3%jq4GdPVzvl6+s7vxXGebMc`DjUyxBKEpJ z{{!zQ`WK>2O(Y}p1$;jgM?=vInoW)_e*idc1* z^=r_p)GOMLUAiB^)YexSe9HH-lgd*OH5V-5pe`ioe2H{_^d%>x2oqF?M-3-}c~I@IaeKn{m{|&|dulY08+L1yS5#>XAP@JeiXr zL95aBN}v;wx@*t2gK?90&~TfoqNk z9hnE5#sRUkl8qJT+C-~Gyl}Mc08oAvr-Ui%eZMMWvy0IWO$ritdRW#7p~HYhe5sCCmM+ zHKN2#W_U~2qeK4R9{iXSYiTxd=YW^WehsA0RNO&b&)T12Y#*=99}#i9j2bd}^;03_ zC?h=}snKzS9Gf(6stEBGxS%`nl>Q5F)B$+8_`L1+rDG*8rcxToefj;Ky~MxSO@mnM z{d@A_g>JWo4RwvIL*A7V?L9JX+!v zRpiMF9+g4S{&MD*CK=h~Tt~WIAQNufB9u}OZG~bxlRh2~e%K}Aw-~BRx?0+nZyjp6 zR1$1^;pzyBFv&v#b>l?B%fBzSy-6Uj^z@wP%{d~{0#1Psm_VdU92Fu|w<9uqz?}aU zGOO(PzMR|7Zz)AEi%?YuYwSo3*u!UIibA&DwsI2SrM_1Ve|`U`%qvfhd21ao{1#yt z<%N}oUo2dgIF|HGET-go!os$LC48#)Y|WAG-g?n7EcgPtv`cnhI&3Z*3GuUO-*g)b zS8D=({#s*IQve!4$ZC<$SBpeVNx91Gui}TKls}rQf-up6PK-7YZM*)v?)ZxeqFtvfm z(q@i>5TDr)&V|zQH9wD|e39jkT(dF|FPU@jZnre;2)c27r0kOMni3hI2S#$2v$i5c2C z7co}NgPnh-1I~`b4uUd=JGl3{JjIA^?Kbf^iIIRPFS-UcaH)F+|JM&5dwF~43}F0( z9af$zj0j$*X@--Z!#LBSMkUmPU#6F*J_w6_eJAhzCt=BeTPUP#d*w?7_a%-FV@|#S z3^w0UVBHzwW4gyoD_*hJtZPJ68;=Lx36da@-|fNP0h2U zRt=>+0XlWZrKBj9mDO`X+&SoSrTUftEHbfVEcAvg8$7q6?~!WSwZegQ%Btdu%f#^wGhSqwa^Y zn`7@JVK#K@f?W4pGhX=aJR|q_2?|`aAmHbm-Gf5_IB*<-#wnKT_F6`{>NsXw4AcLiv*Eu>AHUx0mSj1 z6*=OaeBWkN4cXDIpV~zUVTtW$z;fs7x@D<*=Z`TY>zh|`YI|t`j0jS}KBYm3y z>K3t5tS&35=YSkNK;JemUE4|V4HD_5pi&D`I!L>?auNP6bE@2MbvoGntQLFoc_HY zTs!t4C(6i>05c`*48^`h%B@LRVI8`#OAJ=G&a=iG=}Sxo5; zE6FY5iVH4H;?gnX6Rv;RGAS(pXSiXNpfG6mv*?2OBEF?#GzJL1A~VOSFBXtsmZ09R zK_Yhvx&-G;{5n|Q{ATKp{*0F?`39u7Pf)-L5GO9dtxEpBuIhqe&CTzL$fd|DzvrJ_8o%TUx&ALb zc^o`D${Hmb6S^S2XXjJW7O&F_C!N^s7QSqfA5u4zfBNdh%GzTQ?6kR;(UQA=+3W;! zu4kX%tSW<9M@o3c+H9dBmaosxEgV#MmJ#r-&F~yYo^>rimlHyro8>ZI8OHJspGCt@ zR8T^ef0;Q4i9^mDqx-j3P|S<7s|s~EP}x5>69`DCR(pb%^!zx2v*(yUaO zr>CPQ8N7UD@bAknM?OYpbHM_?mbhIWzVKNdZD$YaQtF75nFU6LXPJU0^jkr@$X3+v zwMKr|;8rVqVWVShiELjh-;r2jlhdR|SrX*oO?r-2Dp)h^mmI}A=7%-^B0{r5-q|`0 zdLrtTtBogO#$>tEqeixycez(^5>`>+Q<~0yc}5>~M_;_+DA`yAw?+;h+TK)PPBkT? zuex%c`$Knk*7QK>9Q>z=@x-|Z-G!^MZQmHRzPxg(VP6eS^2$^S7^wUImf+M9#XAx6 zay8~SG=%Qxrf$(m$+p=`OeGLP2rx-@C)ltLegxe3ms}>lcLpHI%7b6~jjaoyvshJF zT#vj=VUTnQ71Bw6e@CaDiON)t5s#9g-k~$)%9D6^ox@XHXkM&hh$FX`;fW*e$FiRaR~-u8*0co8 zjb-@Q^6tun#rRhJvReeUP19jJpRZ)XMOg#tY~Xhb4xDVf$EzwMHG0kC#!35Qei-K< z5y+V{bkkm7a#*0W4)QQTPT5JLKSINxW-Z1&)>XID(}%^0cMrxXA;dlC%C7S4M;2KoR?I!)7{6o%xqf}`u(OShlJh^aY`&8u z(jj9?6=yj!LAMp#x>aON>`QOO=JYqh0&#|2SThtQe0XT-@WF!t0GH!e%IgmZ4P!SO z{^kw|RiTGqKe*Jt)o6e+0kiO|9V;jpbrLWA{0VCQCQ?;){i)QG-@lygO0zgysZ8i# z9{J6v@r8SA?W<(UND5mR>-@qcGsty`zsq_~emwbZ_cq-V_MTL?{WT{J7S#m0co0=v zg^fbL4yEu^9KSi-k1Qv`Nk>W|XWN=VSK8jQ69)P-R3dG;?4kb{^DZq1bLb1uY2`J@ z;W(^vN8T#;$nlR;|CZX?MC}zN&OY3|8s)b3$7`IlljPX5@d$*AL2WZ;soZDX_QVSI z(-2Cz+4lCNYpm-+>6uY?i7J`J@}jjTlf|bn?dp!2bBhiDMn64@IpvB5LZd=?@t(iQ zNT>&4aKdQlxrk)Z`I~%bJ3M~>@*pNC9^T}%F6Xusuuf_22S&|EX5ZhZ9)q~WDwIvy*;YzR!J z=mlS^ToZtbdvGC;FJ*c7^;jtPkBC&QVBLdRm(vbOR0z%>*QluR;UmjwUd`iMAI-T~ zIj$V%e%3J-rn<4J_Q{Wx@LRG$wi5F2W#wu%g18#WNqe;;+$JrYS)=F}y3#7E@9jyB zvYpRswZ5YHaW~ALW`R=4j|8a8%)?hg(3*%gorDFbgb}y50Um~vmUb|(x46dmKzl+; zsxz8B*4evDeYT{BM;E4J=(G|(6l+T6TggVE)&mROu2i&Y48odw6C2;eV;1}>CsdoA zNZ3WG+1+~b7)1(2nU(JqKQSe$5}A2GXw7DjhS<-GDQ+D6)!Z%eb}#^cssS~y4N#n| z9khtGTsumKIb8AVwa|h(P!4{)i$(d$xHOQK2MZhXK{3%={A~>DFokLetE!?Cawjj| z)Le)$MUHfl^f^LTdLHDvYtn$=ZM0iQU3rS7HY4_EQM~!d#;X0}z7`>kJr`t=VNwBGpL^Mku&qXprb>1<6cOh;9D zHz8AQ(MX&?NH}hKO9T0#pfyFL$IZNA)D;NK&}Ah&e!?h6Q4*0_M%xH?O*yr$;2y>L zkJ3gsXQXLP)S}S|r)b$p0+GxydEk%Rg2aBjs7(E>C?VZSWNo-6Cq4I#957&6zcre~ z+4taX^UML*C#FxVk2ZMy&{j0dKtIJS9DEMpGVHU4G{&}zNDKK?9p z91qa*WSWL%czdB}pH4yZ^bLfei;;c&n44fZhnzuNKDf8}3QH(P)(ezKmm`2j?d!h1 zdC!u|V1YVM@@O1&xCTi2mr-S4pyc-S@^HqM@QtoDbl=kXX%wjsw=k0ESsT7+})sddHB=to)+vR_Tf9i0iSs%f*A zki87CJfH6Ros{Mn+K;)cpZ!9SbGLynpaLv@>B^nqhW8%QY;G$~NG*#@Ph zWEJNzo^Yg*87(griWYx>q%oXzj3?@?JAl~k7(q;HU3Rgx{5U96DzRDKr+G2<#{4u~ zYiw;6JLv7TpMZ+bvprm7r2`AGtGO#t|gY1IvX?2+6 zc(76vCQ#0h?k9tV#$R~MQO>n0pB*VLm-gDCFcHUwOxAF}PPd|8X95Bk3a9{zGcf6G z%mcw?!SyUr{Opde1ja{a)Cf~;FzH@f7`Ou?XB;C$_Zoe%d5{`GH`-#vCO>bc*KD~_ zv`g_R@m5S$qlLWRx>tG3rISwnvWwEc^*=~=n(SAD9!_yRYvQX;JPEj0xg2b#ovt)b zp}tr0R3SL(GeEQ=&cR7N&b1t9v7Cw*OIej%F*k75r!~G6H}=qlSBgNA<4W>uMelsF|NO!jyJKv?h=PWa|wkCx!9Tf`+cj!i%a`TFu;T z1rSl)>WGX2-x4n`(4-VFy`+FqsWuLiVKn|CqrVThr&ug1&kG$v-c#5NxO#ExP2>Bv z6V!mZ&X?bXZjUzrsZ?X1$BN}lH4Z3G$)cSZeDiiASD~CUa0}aOikMzjKO2yfjh>5x1sMPrQZaSQi+E|wjMH_{LAtcQs%#GZx=j*s z!W0S6&S4orq?_dpntGBJHC%rqT%e+M64f>91QS_wed6I;^44?ql0$E)kVv*Ur&I5y z$#cW{9U^AXtg_1}ajQu8L)TC+$#IeO$9zXpocL~9D>mV-aXKQ(sPmxvyFGYWRc}|w zMgPVm1oE)mA`h?ooac%|!IcDv(&-Zlx#=hTTssZMZ0g^`rdnP&b1O#lDc(hW7dRpN zjMFST=$%|s?J>uSnDBA+SHbPGYaVV75PpVc%&Pq{RuP;=`po><0vyFFkKP-7J21t0 zn8SNxwZx715H*Hkw3g;Iq~IsY<%t{@7R-g6ph~H zVnOpL-Z5?cE_{O1*+J!%G2L10l~$$`g$_a}#di$*qoMEt16^HR)Q_MxLcQz!n9^FX z(^dBtJ5nCayOj*1E{dF#p1WCrGY;B0kcT*R3HR#v&7otibkm8sfUdXmw!N)pxod=4 zSTw5q1%tWcwd_bM+0;19>&6>3)_VQh)ntCF&HISAE>kybcHz6vb>PU?Dreg%tm!1I zJh~+WTxDT0QA=canHwbYGh0?7B=smeDUQ2PP<^Dz9&UmyzNH(4{YkTw1!xR z4Z2pNAPHrck-ky3vn~Q{lXUCODJv^Y-5wxEf5K|P!s9!fp4DEVWeW+1aEB2<=fKs{ z#Y-~s`{q-M7+Ran>;|R5NYJnEIif~ldhcALb)=SU8x6))@9NmrzYi)7 zO6yjvo&;!~tw-@Lla0T>w~jtD7R(xL^HPUS4mi{DgW7u2J|S~^QksyQc-n5VkfagX z$bv}|&efevNWq|pa(=B(FfBr;jN;^}(`9pU*vBLDuAov?g5zGRLK)~^l#`WQA@u)w zy=wkDxbD^n5f((+Ve0wz0B&9)ckJn9$zh*^a>$JlzXYa2WL zm#Vtvs)AymaKrmS=^imiT%}6Mt+9Z6)fcBg4t-1lsR6TATdBke?cV9FreKSc3Mw~; z&bawX#2%UV9+GfH2X5r!K?v(bBk?A-&XK(jdcENh>Ny4JIPdONC zl~f-7*gy=N9|7(8Iz$vL7_Al)o1l6>mfiI?3`AD#cYgRRw97AtMoK;!CCf7$k`Shi ziU>ly!p@0&r!)Mq8bYSn*%JZ5e}sz6-=DO;E_lJjjQJA1t07m8IZlt0Pbw)fd8*90 z_Fko#z6_-W8}dhMM)jUmUl?nwnVGTE9VKm}i(3Z7CuQ_fSyAmh&3x*%DO_b^3Om|P z!G`=|>}B)gY2mwMC{xCDCa$dSOKuChm`(jm(=UQ`aN9#qaJY2Wj{mkikGTB&JZH;6 z$l=sgObBv_aV&bzom<1Mb9r-&#G zWgD>DnV!ORRo&gHRPpl4)UdUlgNH^F?Mo4OcBuUAY|Pc3H-udES#<{~B%zkadA75b zXVux}bsItr%^CUFx>f!lu^Fl#J!ekQMYC(n-tZ8P>{dq_wt6%re{yxt+9{lJO;?ev z!l1m4Q+f*u)X8ud!?l1BxPIT)`5~Fi(azN9siS~uN84fbdsxL z8S>Heg5%?5+O<934l&_5B64pOWYwBX#buRLr1K19DHf8h|0-e;tk1TMKJVq|tU+P375aRlV>yoM zwf7pxD=;4h8V>K#_oU>qvw6F1ZpwZyV|hJ?{%|l>oKM>^VN=Q%jgm-04)%n~uyrSsuFst8p-^^Gfb9B3?px%$~?^jyotwp6(23v{^ z*dM;>$_fJ=U7W5i82WB}T);MY#*RN|*~W3awJ+Uo%z`NR0qVp(UG@I3osb2^j3$5peHnds#zXj_KFGSPp1H;XE}m+boNYSBB@Lcv=Qo$o#1byxz!4nWa#E>QHe zNJC{~|FFmJrH|k>)hdEONjI&}Rqf0eObo%Jb$1 ztWDF}D0Kfzw8xI+H@xGvw{PYDSp+MsQ4cHQXxCbze+xiCu3!AZqGkEg3qY8gw_AGj zAJe2$kpFZ#_MuQw1IY$3NsgLImgs5rLtAqLNp0#@wowzGYo!R<* zkLRk~^)^{>1xdCAsunvU>~^Ns(Hs>Co1>qIgXa77!!02Lo8qsLlDea0A{Y&PuxKng z1haBAq8nVp5$gM~ywBoS=>=~fO`pL~w=ik%+nL*iJq1l>h>VZ+$F2viPTCoo=>?n>{elP<{G~W+?N8`baVQ@)lbt-q} zKM_q#P(Pqk@Ou=3ejpU=n_lUF8Wz1{5Auawip8+&P_Ri~_v0EM4$l}}W_BOzob)GM z#w-<8)-c7e7-MXaM+^A3;J-gpC0!DGrWsMPc{$;qG`Au0F?P}--G~}EsXP{WIv{n} zlfpu%O+jt6zp5)DTGv4lso_*)bc}u2z$&QmEv`Ty@XO32LP`C8TsXsO@S;v-Q05Xi zN}x;6;Ie-U8xgd99vrxdRz>GZH!~#E+dUH*NcP@1*7~H&ZIUqf4Eeh3fNy;zpEVe4 z;HCQwP=%5bF-AJq+8e&NRVDIt3%+xfW7GIrR3)#}OImIgvcmQ7s&sLO7OWGQtaCo* z(A~$6&FW>uZ5_~t1s-1&A#t;icLrPz1$+trrn%i`jn)R!sttK2>KT2*TCTh8dWhNW z65KT?ORTdO-i3!MF~2rFu-%!PQv1M8Pihu&dD7)aX$`rGXZ3A;GXYAQWbb?QEVMNK zA$i7of-iKl!lsvy^`o?r`~saV$6=B%#~vE}S)3m2nT zjT*r>&SE&^T15CsvxxB2lh_!ITzLUo)=Rt^1^oGILjqCfO)yxVEles?b7~{K_3Fu< zz50+6MTXP{W3HwX60pE=ctD5xb4WqrH&Y^JhlA_v=S}UdAR^BybR^I3~CUvP-CYWe~h_JgYfuf`{5)B01gFA)A@T^nhRCw?-pP_FFG7g#oCb^!mCaWRrPiwAxH!)kVXH3xW zbctl&y*p?EiV{?UvCVDyG@6RLr_%I&@wY@@S!Jt&mC9a(#H?ej*@rHpUpAcgt@_J) zFx!G?!Sdto548Z-w{v{n3UY2(2%0T_=0c3~407R3p{7I`=<@J^sNBEvI2+Dy7l^_4 zS+reELowX$FO-#z*-b#(A>XL%{D9B8QAj;+HDK2=$1E%ijX5TWNyE_W;a$?;Z*@Kie&Eq4GAm=7`pFh)i!vW0GX zPP$!LFVys=GtrH@S8^soT`lJknxUz9mi)MH5i7rD49-SC+b#~p$_wr1;U@G3t{U7d z-9AXr)iV_V8D$(kE=%}l_8=Y6hvnQ}>1q~3EeQriK6cPte3d3&MiJRqv8zk&L&;T` zj(Nf4rFMn}0{+#0u06X>5$q!UGHV)7f0Fq!oe-V-M3PmE8@Ce)yfN2Tc3YqHGzz$ zT|+OX)Tgr@ta~L1m3@H1%bfdRij2pryR}y)N_M%i=!^y4iEz+ng8YPVs|5`JwB-iQ z9c2U{%v7IzeN1TP-IzkVkX2NG%1X>Zx}v^uSEIz+GB(m5N6geR?^%8OZ;M2{1~WOF z9yzT(8C{Q9@6X=x*$r$vf&5l+Hzqu<+_`Nde0K5=HmjE`HFRzVld&ea;{GqT0%K?F z9+lRR%3ZNALb>f_9}CA3>f+PvD#I_WcloTEI`v8fxm;LaI`^&O$d3AuVBjHZFg~7b zJ#Y5H>>jV;@$3}Q&z2~gUnqXg!-z6hd+P!ZnWd&X4bbg3S)l@PUU$~%;>ifr8 z-YJVT+B+L@KRIM`6iN=&Y=P8m^%`R^()y;=%e+re8Fif z4hG+iVI3-WOdtI|>L)}gdNH|vaMEZkP-R|geMGQKPFCoP zmktuU0wXi;H77`=(a}jX>;ap2&;7nbXDS>+V$P0cY2@yz^>PK~QL`J|<4jxYK$46S zZR4ke~X?@X&g)EJbm!h3RDjV$mFJBtKR~<5s%-c13T&QJ~M0s<}OxheQ$Y83prX(WW`Rq6nx6>WXGTHK;Fl zQ>rQ^cJVFVBStw@7oD)0J9pAWDyM}xD`LNI$qz{^`Xxu(85#|u{s^Az1RClLNfal8 z?-)tdPF>>>i%oOA=;TtVIPI{Ts}}SY+Fmh%63_1PaK~i8Mbpi+rFy?%KK7UuVguxC zB!$0ttt{_+78lL4KwkiIH=+DeOo=y=7I1HxiJIU%e5Twn+?aLLN!}KP$`LiW%{S}j zE-UiQHrh6+52dX`-s#vM3TU|U5#7Noa+2}uu&74JP5H2yVtLyGJ~FnMr_v4yqMoUG zFkH$#mDW+#Va+%HGBi3?{m|J_N_ZkEpRKc5#;|y$_iS3k^gnkDwY!eE%M676foXI# z!oP+S52IVE(Q*+&)aULkDwWRe;<7=lab%6+ZxbcBCAQIB^L*ZGogq;u7YQ&u731=N z5;=2w$MmGCaNpvJ6;IFGhxS)ArI~lfHdZJS&Vbt|9qua#wT^XCX$}}*?67>>)hy~> ze{Tm7u=WUY?4cBH+$43?@2xzO`m8A0kY^>_HY!v04j6qLnSj$ch8&$W-AiHa?oohn zP?U*1(Y?YkBt@IE+MSl?QLpnl%@{XQetx0<&#<69iESZ8P;zZ z^*9(CesQg`{0QCM$G7Q*zzRxC{v{7e>0&Ls%F0 zY!0ikx+#GSE4@-7^FlhJ>J;0V9l64nWMNs?;#00~5cr~L%R7U22M<-!T&&VphI)HZ zeF{bW82iUSE>(#;%#e-l*E|JYvlA4`R)J?T)Kv|aa5n}OttvPyxKv9!*i*&{7@NuX zrpME8lL}{)x^NfgOVa{F)C*m7*k?g<*Z2*O(M2!r-?k;aO5@rm>B?rj;ZqQSfm(hEQmJ%Qeum7-(zFAIc6naFbs~T@819@&D1T$E6uJ3G438KSH$@t%7b+j)O z6WtBhsgN$S-mZ89!m8o9m0lu3o4T}|iZJ3mZ^lxNt7yyC_OQb>uR2rD+M zW4tljsKwY}gY`5+>zpC++0vt2nQ&I9$whpR?ApHM%;~pj)U<^7(C_B4e^i&H3VHZq z8x+U=i00ZXb)u2o@P}`C+NN!;w8|R_$uVJG;y~4-6 zu#=a8F(aGdQj#GUP3f!PE2g8A*0-d5ozCVr06FDGwRrVx)TQfpHWU0cBSmk>#@)T> zb3(GZaQDZb1@oP%O7I28J2$=qQ!Cc7LT4URjyj<}Yj;Hxl|Fsu8&(}%0}sPfSk*|y zi_vqrzx=68^*zCN2Qlii?mL#_L;+(aE0W`mWzu>TXm(CVxPjB`-b~QyoTae-V2kXY zhYM)HY_T}AcWXGD)@{-hSBo!wUIkLv7WeYFp-1DphX8?)Q=?y~DMSfOTIZmzvd5R| zKr8=56c=oJ2N%VEATbwRbJ~tRqy)_Hj)h)fN@?oordR=gr9kx!dMhOa;uOx+a_l1- zldt+RJ*(YdY!D7ffNbueMjIV{upo|3bg=s3eT<)V>=`9Q-%N-1+dlnvLXi#lB9v5S zXR{a(Xhn!=4!*f?p_wxm)lSEGQvPv3psaC>Ud@$~qu#4inT&MHl;8Py-<2x-WIu`EoHzg%>n*o;?}tki5A zW{|c`rP50whG!_@L-R&C8J@Eg63JW2`8y^D^oqB|+#TH9m#h|9ccBE!s8bzN*vxR77t;A)7EXxoFTFQZqPMGEM{XJE4H=wmr>wM7nsr~z=&V!2B`Vzabz zVupK23YDv16|)k)IBk@(?K&*oZqRpr{_LptoKc$Dw@Iza2@=O{w>OXTcDb`@-^l%; z+k%^$Wn5Ch9pjWL;@z0#p^&wBs8MQ!*`!g9NmyX}u3unZ-@tqU0Tl?I>pD zfUhigHPdq6qpK5H+ME#Ds`8dddqK&Ym+ zMK~6;avTP6-{%B#EXTrV{z#^k;-V9ivF{gWOpmf!m!JK*;FD$^{GZ{lPS5FI22{R; za!O;%RJu02_@&u?N5&TwX7azlu0iaIRe8pvp zd%-6d@=jN*58OKP=6S8{Vue35A4A@^FW4ix$;yxZIdkft`(IcMl}~@US`liuRXJ4d z;gVl~gkDi-;@PCdP13j~WAGuwP+}~S6#F_lIfH4mgy$|?=i5(*0c&^(>z!Hxq2>D<3851NOS`e8qPGLf9jU%zOrxqy zRVCsprVpmah;<_%x%qdfFl|OdN%+GUi5ByNSH8pXx#&f0AA~Fw}l@VE8mFA^G*PX-xzUlJGub=8Z(o@nQFWcZ@6K zk}gpFTD%vbC;HT1R{TTDv0;#KzcYv&a6g;V@ieWW<@gViw#NuUJ`i<^W#JEdtr7em zis8YtaU`d>;;gp!>#4=0V<*qm95`EZODIlfcJtQQ>(?8%CJj%mU@0vVOtuef2#;SS z@It=7eWgh@s1|oh-o3gK_DADZ#@HugG2Y^)`0D6`MkCcw(_FTaTi&PVdFLYZ;cn<^ zogW$0+OQ5OFCp7Yv6}VwJ_;?{>x^^^JUBv=Ox{$aFn)_YTGi;ZBqpdE{=+Q%H-ca0 zF~63qt!7HoE0g>`I6vG-{rLG2cGgw@kY3hHkF;`Mkn4E{%K}g{x?M4))fun!;BHO* zJ{DHjf90}#eW)$*FR!N8!{K<~jvlHlQDX5szblVCEIE7ee1Fu@2#w3G-hl>G)+ew1 zm#b(#j&d{4t8y-@toa1aIx@Z=K?>}9F$KsOVfTi)6A%AYI>SqDj`xf^rr?_Qqg8U* zt>64t7rP5V>@MTCvdzE^2a-n@6p@lex=REU=}r;pSh|)LDM^u%?k**k2Bj8QLUMs6Wa(UB zfu;H0MSuVAJ)FZHV)x#;GtbOCGxy&9k2fdhREFh69483ogv|#K9hFl%&%IAmF!Z8U za>||iq(54HovW3qH$_^hqx|!Tx!UJG2&Z{RnqLt~x^6^NWNcQ~t85hELvd@MGkS4rANa4K044!MH>h5z6 zl9xgcNE`-+8Sb?<-5%w)a^I^Ada`}mFVbNl<&?WbU}S*ZZ>8d^;?duOfm=<>NXPay z$@hQl>du|`xyOG$FO!( zFJ-uj*NGbDhHE{Gxdd$5Y*6zBqumDKf>;&&xi_1}+?wSA6_sg28oivN;)UXEo}3uS z@4rkpUPgbGiNj;YklWBF0&EjxOleF6?lYy(V`=R`I^$j<$&i7w2olXqB4XEH(!3D? zE?Zyo`MtFAB;QzDzrS;ibjKqWgF&(mf1sRn^-CO|pEG)?z21!tRpv_(E_qb@qBxV; zH@cvxoVmE{qdDAqMM0xEl0UX?L?1#n)ttGV9S! zIBC>w_Oh^%g6McJqDpuB52;mbMqelN{a)oZ-IdR63_L_b@l3H*4^X7wvul&b^S?gX z7OWrt9@nJB1iI*?fxhOy3K*K30tzyC5*lAaAYkr0j7QXLKSUBE$cH)Bn_Jhz?*DBpua@MuTGTbH(;8A8$ zE~yPcb+qG2+ov#a4QLD%*o(}6(fOGhEK3Aj4_s_DszHLy?G-R0$B(BN$jjYgiz2~> z_v*DKk;`#-6_@x6*V)uj-=>H10|B&-@F;~0V!8DA@#Wb10KKv z?zg9sak%0$2QbuuL5!hny>Rsm;ehg6Rt@r@{Oi^GDY7H@McOW8?W;9M2|r4o8w8>q zv%|p`u@KoMQOdKU62NPudDusNFEbDOQQ8P1Z9duk^y6})W5!yy;-FZ|-J#bG@e{aO z4&H`7oojtBIq8A4-^i1Fk8 z33#e01v>!v|7s&`Z>3&)eMg=#f*^mG5Vd5ne&h_u`D##kT!Roe5%h{ zvd#jQ8@Xd-AY0Zu(RnFczaj=+R7oNH!}a3i_(+*3k3IpqqCFR^kCxwC_}BLjJE z-!s-O?)4eDWmmO1v~l;osTOh{Uj+(WD|vVqxZvcUGqVy6r9kx9-1!Tv$|d<0g{-lf zBrw}C=<0HsnFoR>zD~s~!3`2Lwq(ckDS&q^rT*?+3VqSs>R|`Thf%h9lX*S*x$Nus z4q61(xyPJ^V9N9!$7ENlWOq6I7-I!{XV^dfw&ep(rll>EKP#hXUuDSJ zdF@(%VS%j8ke`d5t(E9&BqC4Sb(ZtnXWe=7-6^oCv_}(|vZH3{{7cE)Dt`f51-lq1 zxJ4ccZPY%D>f)C~cKWt#F@hh-DwOur0c|mRt@T>rm(#-oj$#=NDx0-|0$uhLOU3 zEsJ%XB)2oMx#ZAz*>q2}yhN*oT&0sW9_Zz$)oCUq*A@|$p`^F}8o_trhcsi%o)WNo zW)7Oa8JAdDzn$UNIoO93JiIj0VIE{0 z@8Y@%m2YXic0gU52nuU0`t*(j7O2+LNLg6Ayu$E#72iSp_C<7$B1Lm_FM%nQ1@haw z72cl>AbmZUw4MH8u85fpE^ghT0DHTEMH|$Y?x4{kUsJ5GT5rO#hr_ySzbUyr$9LEd zv@;R$DRD{gL^w5%jul&43ocu(C$jQQv6a9Rr0K}*EB-^Ou1Hn8mVPyV_gR}uM$C2M zTI=M(ot3Kg=lujw`^S1a2QIHVq|H+G>gtHmS&a@HYW+Wp!3esi6KSNwJ2X!Q_|tI0 z`iUYL3lRY&dL`m>nIBgdP}<%bV-^&dB*v3SefcKqN=F#v3c;KJC7Iq*fw6`pM+h6c z#}x_y%BUV8TdTk#rTL!;2S*MHXIwZe)|+?B)b>zSz(UVs)!xCfM;r!qEQ=cG%POIf zVPq#3pU0r=7^pd9(xXWtT44n0@B{TCam2;>hIP?kUb=Y``_%@go-S$#py z)cedrNyI`p;iTLGH7Bu@6b_7hHcY#^^{z>U=x6qb&Hd(>Ay$Pw8Q!0DtyGU+PhYHk zyGw$Xq5FlmZQvJPpuHE!yx^4bj&y%6dHd!A&BvoH-U@GlsGNclX^Vgs`twikx7K)< zxfxVJx7g7_xmg6L{-H6Ny)rfh7mD^B3ok1J9i27sKo4uk{2mfX0%XAABpXg}+{;iWPt_j%Bcqiz4`o^eJV0oeWtK@rJq$c&2 z>z||pwx`h%twPbX>`swm&$R7-Jf={{={kjvyEcE9L8|yY~ksQHHrmt#HIf#f70Rbz~vaM#0mXK+>h&9 z!Bgj(fJ|;866MG!lEHrh{z$RoBCt5ojCuGKf=d5qWxo(=b4BRS1de@^(0Nq9@XMoF zX|>44cNnPu;|We9CycQWFMm1{P6Cdo5B%OwD+G*E551+enPMQRVnT`U@V;b}5-gpPP?yIYL{PXu74dSZM^Yx z&Kj1$QXUGdI%;R=96Gc;Qnbbu5f09KOHOJ7+Vz-W@KL zM12)RmgB1nO?<5XxuU$ui~M;znZ3j)^9VP!ktaaF<$?ryZHT7B~4rheRzUn*~o^I%M3_#Zl-?FwE zgja2TR9Baz7JsMLxPEwmJ}A?w?fN21IdZe>Q1h^C`59Q$Q}a+&+#t%<`=(^ z4zmbKsAwv;@2~n6FguCiBK%R;m!VkOtSQa`RmENnDDsYfiNij+Jv$g!2t4Yjnn1L` z;-KQn1?W`iJI0|;VP^Y{U7&1T;`5TiQFT39mb{i;OI_hkL^sn8M4gIuKVIp}8e)I} z70WA{+$w#=OZ@Jw*~O!`-y3a1Y82>~o{D2rr~pOQZ$T%^k7IFxk6r3y&4l(Hoc~TyI{9 z;=B+uI3!?$`^U5FR$(3r*3VW3vE||Ij;E!rDAYwn**J zE4fZo6G{78n!No7tZF}HwADlWOhX%uY%J4zWBqsrTQ?bv=#tvQs5wXZ8{co%K2zF~$w5;75NV zxFGVFJ0Y5c4o-S>21YI|3W|K7jrv`r7WIhYcdGTJs0*qOKSc>i{JQz_yc9ftv~eWG zNEci1TqL07_>0-yIX$NC$gyRao9m2~L^x}>zC`ug0jd*Ae#gOkA}+M1j^Q#SG;A7u=>n0@y5*l1yc#qdedNRr%np=bRL^V+nO{PyW=TWdrPE`r6nEXDLl(0R^HiR z_fh7}S^oF3F~+^udWUL?5*{7b=n=k{>A_|bhY`V!*h zJnKLgx+jhBQWG)qG1IKTi{Ra46Zbvdna)+_em>yvt{@Iv_RL(Ka>eNFRWefz zyANeq{&j63yA^#xP}Mqv;4bg?!YW41bu9F52Vy-Z2jCt`=ZLd|V(v5Ht*+0jT{p9F zv1z0h!<@KP1Odg{ot>AdV$#$U<*QWINS_x_he5x|&fydmk3j_Cq=#5!fzo<6!%pl? zx?%N%IpflLAOZ~=95a04#jxbClP>hDpJ__NGtE{52Hv}R4dkx|zQ``s0tnQdDrc)y z$WW>|!C=_V;n90w_36@WR}2Q+t%Ry0@~iOi3V6uaCRH0>16T=Lw(RUqf2c!PbWMr4 zc!qEvQ@+@N@3gk-VT3E2N|eHeuNM%%r1l1R($JBpw9z-1zC7hWq1pIjcg}f!Lna#f zj&Zo*Y#9%!F180X66sLQFgiG@pBn&x_%yHL^|h7@+Po_*Xk~V zelD|a$`fG?L0wt6!W+if_c+}2%kJ8mv%9 zX8?GLnmW!GHOT}%j}*!tyN%nn2*m&~)fNM1>R~$v@E$)u|M6!7y+%ISfbH$APQZb9 zMdkMhAFX6*R6GX|*@Fx27p%OUD};|g6Pngl0g6ABHf>3xu-9L}TTTG_2HD9l_+0=z zJ*XH;rzDw@bRLNba7(qV-v(K3DW z=;td%Z}sLpITo%+M2?oX)^GSY>QlDG8!EHNO%@)I>}X;eOD`Iw`xay-1_l&)B9Jm}k+5s~|wtW+;l^)z&>c%(|3r^uh>V znrlR%W#8Vmw?-tjqZeBWmu}gTZiEoh8c-bRl&ZOa=~QR-LV*%;4orWoY6`M;_FH3Z*?(s zdD}ObU$1d=pir3`a#)~pY%o6_Zk>gF6~=y_Uc{kiU&G!ax87@e_&)s~g!75gUXDIszPvfOpS#ORgrl&tlv%8Ce{RD#(LSx9Nt~ zW7QvNVl&{9MtleTr+LK%{t7!)wc!4N@nPezhF_aWu9l3HN?y3>Z>klGH zQ#ZhRp6Fv{aH`OYK^;99z+h}2EJ-qGYD!K`wDJ!uF#J(9ML~V_Yr9Y1; z2A||ZOS7SAVR*$68}9`pA`wo1SqWx?7Yd1M#|4DsWhc=E1wTs+*y20~WO^R$$L2qb zEN8Hrf-lURFxhb?-%zhL6RJabjBmYl3Cx#gKSc!)ph8gX*OoB)4<^nZ%aL&OOtEsz zj!)qlwRuBX7r0i3gH5g1_x)?hz@qapzpRk_ozS5bX+!o1u&)KO_bPNK7GQHVSdfYd zIz>Q)1EsN+oRXcaA81;4_RJ$KcH~%|cFl>30EL$!2g!S_ zKw<|!|BzXFLCFDyPno>Cq)YLvnlA`ue>bq||IWJ`w5?ufC8|XDQ^sPwY^Q7^Pe)HxlfLBb|#?aSW#T&)vpC|nTIPoI{TPQ-jB!1Rq> zsUx<*kPR;0Y3ys_vUzRN`zzTOq1!+>FD43Xp_?pe1{7-VGV z#%b?%5=*7LcA$#Y*ykHul>un?88WoTgR;_PN>D%f*z`e<)mX2c92l@>a>=C6E~NS*|@x!9jur4-3)HQiiv@yk#2zpBCF}QG{H3D z5BNP1hRh{b>k4N~`Q#5LeIA$0Hz@!)4*{y)V*M^W0D{2$7;m10F3#-V!FRw@Hf7e) zXFmDF4L(yWMhnJ#=#XAA1qv!Z>!fgY@-qFUU-n%R-dL7{viVQ6`ph*04ZXA5^Vb*% z=w2PGcP>ts(QOL=H{1h8lvbtzp1<}sS?)G*NBPLOzkrf#FIA|X%TGs3ub(RWf7%P9 zZ~jX;J+nS#)A#SMDyTQEx@DoBRGO8lcOW&@$}o~Wl;aa_2Art{xT1ns1;U2*TVs>I zAxb3BdC9vdl6s8-dh$ENH{we=_{4(pwZoGRj-3xej3ITq%T|dBTqkm36il%xuh}Ue zi7izFBc_aoW`Xh*Zm;Sz>uPl){K}+InpIrb z=2Fk|=x%J8-7*-yH~%>|Fs!2os6f;%wYp7>h6|nd+{Qx9VY(zR*sCKu-f}}zXbp|0 z$WK>LmKv^Z+I;tnD>?AuY6U%McK{w`ioK+OO}L5ubZC1>Pmzugsy=}%6$bk8Nk zM_G#Q$+0=ON$gHD6=#3Dv>gYWnyeXGRNo9pla|jAJa2iWCwu8ZJ7Y+i3{yCrc>(p` zO4-}9(FSj2vUVKK#ikp_7sn|=`_cu!>C?@=Zz!8u2rh8rgm-(0Jp~t&UJB3TfL+;3RLoUHFvccCaDn`J-GCX!{9vt%|dmL(i zU@{!Oe|(36wFoav*6q=AuMRu2L#TTdkFQ{rbmR`d2Rts z%(h9}=>*WXZ>-nDU{+@rmg|&JU-F@=4C4k*FvU=Xz%W9(k;zetbG2$ms5P<%f^aa( zJcmR?VHFQ-x!a;RqEz#TFQ8A2k)o4OV-}I?c+8T6S+pIWXVT8onuu#PI;lCy@YbGP z(p&|m=j@oI?TGO_p8L)GK4Jxf%E-C35AClMUGcknyds*BE0o&D^n+9%?P}`_& zI-^LAmf3~~V%43!8?tIngea7B*5JMQYwwi>50QB+GnX~vFdMJzO}R?u;-dLuR{v19 zoP-9y2y#>QoT>4xSW?pWMZn z#RUe1RxU2Dn6oH)Dc(liJUXGfqUatQH@bv7mQbR4-m<^^!B~i?w@F%bT~B$S0h>m+lYIzO4$kwFu*eEwB*4l_uR&w4_-thidg0HakX3siZtB_f@Akr?3ILaOC z-&@>z+(1c@;<6*dAvVt<-zNR%q!r7ne@It3YQRu}glH{+j1*X`QLuA9qv-^uK$l+a zxf4pzRdL&Jv>u0%sQCc=RQ5WEb^#W5QD$#MzP?(^9EETK9RP>2D&LJ|2E}`~rC;4U zbLVl~;@<7b!o$0>d>8P_R+J$5`D;S@?wxkKUVi>9;2Jp4u9=-v9Vja=urZxiF<2f* zf+bkj3mLd=UF(~+WKp(Vz5MBUIN_hYb(BAJz=U?&cKIX=y0gDiL)I3!zxlhyfh|f3gdcGo&0v6wal}4RT`x8 zAF0hUVLyVGq~FfvwVKX%?`!02dK3vY%&dR+9vo&reC1S~`55IKO3uzK`AQ|lUCk`z zw4`awm8)H@0&-OGMJ=UG+I`6buz~_!ARGn0JvO=6x{3k^Cw`hkRnD;cO|9nBQ~IE6xAoX|MM)#*i0B7|X=+ z1@zm6fp=yN6O_5Z<(?vyDCF1az;HfIC8V1bKhn+~8%Cno?R0-oOn zj9xcC)qWvT^xFtm;1@ChKDp$^`ZEeK4saqa3UE8-Rrh5T8ghaoQ!O!mQZ;pADCPQB2Wnl*I zdX`e+Bx3vq%r6B+JwXW{7BaU@^iACSH%gD3BR>T@XeGJ1hKE@F$55`Ndv#%b^;N3m z=oyJR7Gh5s-%0~Rzgn>)VxVxl8-A`y3y{AoXk-oC`;43hB(Hz;a=nA)UM3=OKn*PM z1NG#n?hK2^q}L-?Bu^(tR@%G%cN~863@18DF&B^rCeWL>0pQ&V$bZ=Ppc(L- z=gD*0$|<$5m5d#pO5CsPsq;ifPLDoEXjeRxj4WBQ{5GuTPux zJ#yz!be;s$Jsk$}_$_yt5EM0&W%;ZXo6`q8=pDA@r>}Skc+>MIU-|g7_}yAq z3tvs~V_{#nXcU-e6vKTKKo-zZvGivNa0*HIhULFb?N%#D`nST&3g(FlGvR#DUz}fQ zDu2i@mDc<%&i9zNdMh-X?Y;_Y-N3`wjUz`a*C_AAk2ors_S819ZQ1sGuIq92Hf7}B zc?YC%MN4U{xY+LFOxOw+T@Lx;2xhlIQ?H#$P0yH00%To{v38zxir z`|V_yiob(X7UPlUiS{n$g*Iz8GC!kD6xJQ#=J+dCJPp6juwfI}#ur0#cFn36e>ZO) zg@+R~xq6f@2_HxYPY_hGGIFMhWJ7V}a+qfQDRs|9Gu`5y<{2MvS$Hr)b*|#}Lci#T zch(Y9Am8Jkj#HXU)>fm&&wsPA2OkFxP9`8tqE?n3KA@oi_8z_@iK3-oI%o1#jOpf8 z9GWu!x0HU_F=r)P6-qASE5;57%Ko(zHkTYXK={6Povf!yt$tofq#lYjId=EO`89Sf zRR6Qmys25|xgh?@$+O2(~$8ss1` zF|XcY_^k-8bcQc>u-A%LV&Yhgg-Ul7@Q!@hh|RNsC}T~~=ssv*%#)#0m7n|%(x2WI|OyEPK zDD4Yks9E=0_JNQssr<5I=-!{`J3xvAQ6I=BOeS^i-Aavf)Ur^+2>Kh#DmoNyaFF#Z zz`dk?ps4V!R8b{ykEbM5-l5aV)1`l1m9KTT&;-;0!53+A~l-b3&Do`yJzi8QkqRGQY3IP9J&)Ce(19bq;(m52z= znRQ2EyaN@kD4rKke>n>O`s&($Siwu~dn9|{B7?tjZHKIIzKf-w^FO2*4f!A~HDT#w zO;h_M?MAoFB?7}h&3ct@RkL2+RPfHA-1KN^Dz#XDH4pS@vG(X%jD3ykZaN|EQCL}J z$>T0ZyT@Ee`8v{#o6U@TW&u^?xzLRDxq2?%R#Iy?J<{aKN;Y=*VDh^5XzJ&W>>ZSe z90@U8tW6d9hW>&~HRYiKpqG$;=MeLL#!~n6s2+=!e*+dD_t4+!QbgiqlVY>~;%lUm zoO>I0%Dqe#W3;WK$s%DXSXz%M_G2oGuN7TZmRDtLiE{<`R}`IE|DSb0kXIc#T=TOO zT0BF?Sygu;_hb3zTzWpQnl$ufo5F=REdVq;0ziRt$3TkXMfxKFPBJ#3p60gKiH&$n zL0)f2#Jik1IsPIR$%aY#(zC=SsE=afIHS|2iGK(F`}=KtPi3tf7BCte{wF>T#w->1 zz3G<}is;dlgM-!gY*RvI?aogST5hU42i0aoI*FmslBb9SgQ()4CB1hx0528sq-H$> z62lab@6WFNY@7xT*F z0lc|0b!qXh!2F{(+8U)rvLl=9Dr0f&ZGZQG;E_CKR-7_+UT__9cSxGR1qpbOhK^BR z2xAyt&d_b*!q)%rkvQ!ysx9g*R}&d;_LN;{r@ zq%xZK+Yw8PxKGBz^S@0*ZVo?(ztZ#V42=m28SaDs{e=Wc=5yQcmT79Fdu**JlaQQ#uSRULJx3iD%vlWUQI8c%&`&>w`FN9);T-PZ@x-e@ z*o#1G!CI_c_NnEWNcQi<8cODyCqXJjyh2lR3teA0f`bep(4!QI#joCBk4(%SGDU`( zUd+o?f@vJ0<)zLU+1X2fxgZR%&g$wT$*ZfYqFmhE7j8&!O&?@$P?pKu#AGiT-d69t z`gP|NGr$oGXGu{^6#}~h*C#I*Edqxu*=!+e(9f%MvSk{Ai5~GO zuwTqxoXws`Gsr5cz$x_Yf6cv#d8VKYUrzHZvp(3EFdp5dG*404K0&ucslxZyMxBah zwMu{s5vzt3+0@~frM{Enjmm+34fw3@#o3|n={%k6$S%UrS9JC3ThK&#Jn8-W&35D8 z=WMG_SM$^RErxQsU8|>Bd@s^@8;pNT;^eR=%P|3PUf4k6x!-qq{LmVn;~d zi<4QN>eD};h(S%5eqpWR#jWXv@_EyFWu_8M!1?XV}hiC>nz#$xaTGDGr{k2?JEbXd9NS_(036AdqFZLz;xp44NC+!fR8thpwdhOYWjJ)JE59Rtv=9?E z3Z3;i0aw|im&XI=HNxx`oDxdonG{nFHv=i&xhu01(}{VlnI;%Owb*_4N43OxY^U7w zb!kQ1x1+S)K^FO{r}CB31$WVBYV0islh!THTT@5G)u+AO1E(HsMEp6$rbhyxy8SUd zMA2fJs3! zZ%(6*>tm%gd+P|L*?}70-EJnvlOu91{U5?0(3WSl*J^IU79F?QoeMfh{GyM$drvG2 z<4N6=l7Z7wFU!QhqL2P}=hdOFXQw$aimVd@2^@y~Cy+Rcr+X+kb**PDH+ zdu!k|&6ctJ$%kbDy9Z5{w!;;V=(;#ExJo*{#fGb-V-9UxK$#SZKh>} z3+>i;QD{2D0l83zH_n1|s|rlSm(M&lC#%!WQm}4y`Z>^@i)$B#1&fK?=8^LkkE%tC zS_ABkF67vmn3$9nFNCXmFQQI;3*(P2;x6n)xh}*p7uC8;7jEY*TJTekpXG#BiH019 zE>i56^=<>V>1tKrMc*}I5#@?>%=+Mblz16>Iq|eUH+~V*7;T6caV*v>g>J8>=`JCp zd<@iq_vkK92Hr#I$VCJASN4{zB2ypHC4^~pZ#m+$zBGRSEX8nH3DDKAXDPEcfpc|J za4(n+&t9@eQSn-FwWJp;j*pL{kIrP+J+T;I(k)6mCxFDToIc`!P{m+qH!GcHVo>v9 zyxv%$X2w^PwLL-Uaen}&mESz2KE+S=NN)4dOX>oHRdTV~wnBfg$Bf|1b1 z^Z`vcpvTB(v%=;@rbjg!)I!b{-JbbV1K5a%oLLJ^YFo>}&45XMw$j;J7OXVu+eHo> zx#+TEeEQ4hPfv<8ie*wf)(Qb#^2aCaOo1#V0xyA64PohSGZ5fqt;75?1FxM9#uJFD z>X4hG_-uB3@EuAnV8w+;c7J}n1`(eviuc5BiROEs93+qIvXwV-T_jnT0fSBl-dOtL zXuwzQ0Q0WNt?-fb4z@qTMuwl2zFN5>S)rsybq_# zOMtyJH?5|+%^c~l!?F9N*KXYTjm6O5gy38~1sK2R=g*&KaU!F8DC}y}?c;NPv`m)> z97YDb9Mdsh>`xbOF%eIQ0vlOb6`6|z#xLq?%K|~`SD18L9MwHDWXCvl4y5WXEvo}E z8sQRO1}2vue}svh;&%n~(tM#=ts>ob``69N#b%9)bhx)|+7uR;3IJIBcH#*q&(X__ z=v3^CC&%TBQ{i$o_{^Et58b78)Vey{OV10?9dy`_bd32cZ}Hh&Um20HvlP0wKJuen z;$x@ZFz8e2ZKq7=j#K*ppc2bp(%)A14sePi00a5xd$w-Kcp`{q$jr>deV1zF0LBD! zH&laj0C?v$Lov#Q&TcF(GMx#A7;3^BqcF{7@khRX7ZitB_O~$KhRv8`h}mO(6@5`` zGv!$Gz=iQ?OCD(8;?rqM0q}==m;rH)iGd^EZx;!G=|o{J>UHDGugD%&OR&QcA^JY0 z%J5UF)^f(vlR+_t8E`J((#AhRbKx#F} zFPV%wT;`d6x_+ovP7~2i)~WSRLaP;ra4uY;LvGDg`kHwx1H>lk*;X7!Ro=$=!OODU z&V3aDauBW50_ftk4bUnRD}21_ND)V4M_}fwxYgFsn=G!li)QP}MTtIQ@m+e~L+RDD zdCTxhIWUopQ zi|+N8*31YEdfqpix=H7?4QoI*!l?)V$aY1SpMDHj^=3YV%TL9e5f7EayIB-z4*`eNM47YCav0! zGzEvu(~|>LpzK>{KZ=bN_ofFbaIwYT>@IE^RqfSj^6Zu=CvXo%e;vvO$o1u`MYOZAJ-m*`T_3IqB9{j0lIgxf$$baHyb%x&i0fQ3E4 z2o(NFa0lv>WOZUkHD`Qs-O=YXEC5f&b98PNOFgH(-pIY+(^^xPc@>Dmme3JYymE3% zO1_-j+)k$emO@(&QDIP0=KtnBQeu*qJ2cl_g9JK^Z{|%aC9ba9BuK6)j+Gl4?g~fo zxm}!LG0yXqrnBE?|NQzy7jyP1Me9?K|7B$c4<_Zhloio$Ky^>?fo9B0%6~<|=gsT6 z=DTERT%Mg+n>Cghp}a!1n+6IH(sxWa`btr=9`yturX?;50nKu9GqKnLcl0w%+Vwxr zSbLeUnW^fHrugKbM@o>G*~dT{5pT^Sz%4vut%RYqlVnkeq^6|-9Yp@V;7-3*AZS9j zs0%PxTnH_op*#%-!neaHI3l~dy1vDvrKQo((13*n|LHyb>%P9A(H7+ygw`a%+|=j% z;YdTVs%lvhQBo$woR8OT?xL+t(>b^Hf!MMbh*1&W&ffaX2mG6Ds2KUaX})cZArpt9 zh!yk`>nGxBVD(*I+nBTky@}4u4svrMQv#A8*CxaMLN#Nd=ykYofyMm&%AykaEdw3R zkBN{=TW&mD3)XhwJus)sHcPt-BFupk6FtlqZ+g^lIrVwH zuM9NFvM$8AvuT!ZZo;`;)&NHB9P9m=K>w9A{$i*ewC} zC*IQbw)`s1VZgp4kI-X+2N4;KKRCVuw6J2WHrl==GWN(rFX>o`oZ`lL)XqiZo<2)Lbd#@gchc*(-Tw}M|0~&?A6#Sf0?96{0Isr zc%(u6;GiesZ>Af^wA0T9QjEMs6HC3=b+(lDtZFNc&w0T@E#GG(kYK4pMddifG5^KB zFhI;^pVb%9L$cE|Q7vOSfe_gPWgr(;uU+$0QZd~6-oR}Bn->bFR&wu|C`DK0>qO}T zmnLTh0@-<8w~B%-51mtiAhV=C%L#MfQa1~*Ip7MHc~XMljb&3aGrq47EReiR2$*z{ zAm0#PE-^4$E6br_iwokWUY{VQ;JjDLOUI)JaQfHyCTGX{BLEzKewf)Ep*F}X_ATsY65<~ig2AmQdiO-^P7n^gEJd|!%jUjVO z#5ZgPGW%dewDtD>;@v1#^OiK$9vHvsFT3mlW@B3NUK*LYHoC_M*|`H(rf&vlw~Rog z>Wq7CfnT{<7nICRR*KUPYD=1rzDe~-&UaW=r03*9#-YwXfN)m$g#xY6U; zhc{-onI5_wv@`vij~4@-jf-d2AL7PFeR%Rd{F?bh*okcaCHsvFyE9T!9Jo9qaY%`;Q7m8kG^iihK8j^Kc<5(gs(i16BqZ$ zHE-vx+$Q|7j01<`+%cX^b2U&9o4rin`Exp0@Mqe6Dy{7-q-WT5P!`5%@i%*6e7W%+Ux*vuyZ0lPfq z%)-_GG{J?#)2wMJ@&4$BxJgt?e8m`hb+zo5 z_iu*t6o`rF#76WAZZU=gF5PBV zoC|qtxo+1DCB6MWH(F|vSDGai(=d5_C*^GTLY8vX5(=2!3)5fz_-k0Aum|iOO~B#* zn|ib2MW%CgIcI9Bz32@bAbA zmv^cG^Spq;Fj06y@|3)@@BwD@nklx1B6u{{1io=WA3oMN74%GJI7d}AXFi0R%URzs zAUnqEP?3vHsi27p2%wD@x}vT5OH&lL*Q)sIBaHj@<&BXu1=0_8a&LZS_`W9?K z^DfB=k(IzWli~qibfzS_KXTZgDqO>J(t{fmo=fP)Mk-q+Vg>JjA1PU##LkU4!EN?k zD~mxj1ikx0Hn);awmJ@zHe{#|9NLgA&uN(fPC#0-P@$%{w)+|aPq&jM_25%sXj>G> zrXEglxN8O8 z|C=^Vi`VO|_F-^`Js{)la4K^sFzBRj-ySCM+s%B$IZ_=R9bazY0cGnye>V#2m;~Ep z3|^U1kh(5Le>35~NJ&WEhhBgsSGLXfnXHhQQs|xOfeu3eaFY&{xhD@bg@s1=do^EZ zCOg&oKE&Y_xAz9Z?Id(=VIHF<_bMBi)z-nXWPGbyX&_A$z5YA1jTZCNFO8^pX>#oG zKiyQl`87@EBwzdkuvdgSZ77awSaX8o6Mgm5O7npkw?1A(FMU=_Uo+2$`@fnGl^j_@ zw_-Yc<$Cjb=qIb-%MeHTC3y#o$S*vC2^gy&j`uw31eO@gM`awqWArS%jIX>9mP!Nv2F&ofNR(enVZ6h82VN zPCo%&pj0N)iXf<8};hSa`>%j0E24l=xr7ZGOPY{$ET?b-^CWE zW_Rq2d>4^kTT9R#UN}jHgkBMq{umu81;lS^_p_;H1)76@@~2z>FonmbPBua?aljY` z_=pb}{xf!azS5L8N7-fH$=k?<2lBvSC>*kbo<4c!mR$PaYwDAeu8ZH|a|6e=QqL#ctbk*2jD{3atV>5YEWrM%%Xw z+(cNXmVlZVM^sG)r)Z;Ej*MXF;(&L5$d_nfxHQ?>(xRA;{<`yfz@x{NTWyV)yu0!L z1BHSVGe0cP0x=&x!=vAMal=5&ms4i4w=xKTf6~jN6DELK5`u3yU*@+X?y>YfFN8j| zkbaKoy+lirsZMNdiO+{uE27=enZ>Emks|1k%(Ow24z;hJF8VJ}UT~>xAjep`jt0n|o{w zkJQYO|5MfbrxQm`JawdsQ1Z6L@Rp==?V1rl6V|L!6qh3(+146`OkDiMs~^mo0m-S7 z@67)~XVPOKkyD^gt&ftNtBrD1pdb__V2rkW`8FLaE$mT)4gcQBP@0Hu{);N@ATD24 z!84ag0f^FNrpR@7-56zs^momRdNCs2B}d;RHlx$h&Lw1II@3l*)R9+Cd%DJEQ!Y_p z00M&&{RaZ{3LaFO7nupAB$1WAlTvA$IJl?j2lT}P)&BYPWIW;#|2vz5j>|HI631ayyYCEZxbU{5_HW=| z4}4FNCsSKk;orwv$lp=K{P`-nk5lA-0C=0u-NUJI-pI??I7hi;e5G0n@H1)6029Rb z?dB#Mw=XDJzT=H~++N(l`JR6%(SHW_E3Tv}E>@ItO7qsTqClW)|D*TTQS>3cK;%_( z5wB-U$<~0{?`^)k_*NowgV|KSOq*jLPjqk9GAkir;)R1{?@Z=0*(yr?&)b|J_Qf~Pq|Y0tAL^Fb?if$ zwpV`*aKvWJ!hs0%CiG6kn@DGyT}6(fsEQ>PzLQnoKFduw*kaj}#sZ)i(xNAd92W$X z?&%v^>y8lFRb?BdTg_2+gBXF{0iacA!&ye~Sr_hDzWIvdrP({xZII=;1n`|uF= zYiaOt&?rgwJAs*o@A~)>o92|)0HgftqjQccAgk9|v>+6?1`fR zG8rGu_fb^RAdE9(KZYP$6iAjbJoPK}q;bu4ifN_osNr4XC zDtC{Mx1RBwM6+4;y)9iWcS8=(tlUi-oUE0I3>)ix37x-9F}Y*m3>1YRq3GIM9GHFR z-ntsQB~Vti47jK&(9EL72SDXy5smrEKz$JwVdWKl#Q$>h2f(6i=j7x}6H#K%BCfa&I(u1;37DWnKEECA}Y z6Zi@@uUodjj*k0EQERh;Uj2Vlt7;|ZS^-8zuBRd_L!5(Z4=Gl==2%|$UFAtrb$L~z zoaE@McD(rc0WRXLS}k?0T0gs+_Cye5GXGK#WF_3bO0mS^s5WPM*KQfu(0|r!VSQa7 zEz9Ms7;Le_&2HJ*)@Qjft#CEs`u|b&o^ees&-<_*yC@a}qzQt6bft)N3q?RcLkXQD zMLGybCt#P3bSVL(_Xr4~29*xd2`xZ0^w6XQ2qpi$qv!kl9^Uwo7u>tEvoqIRbM0A=2JG%R3^EVow|m6YU=w8Ra_ZI%ZJsvq_A5sz7a&a$G+j6m4n! z8=m1-8PyyT-C1!yrquG5H#JSMqUV19)&^EaCO^Jhtf zpY=4~a_fftDxDi^W);y6HU9qHgAD)0xpu9mWJ76j?(ZZfr+y-VZA?s#j4bJt9lr8# z;7Z&GZ*(H-{N=byOw3FySR!ZWak%wB{akv; zt<3D~nWPh=uWtqvZ>Iz&2dpd1$2~jkXd>G8{~0y78|306;Sd`}c37ADZ$yG=Imb;c;3)OgiYjrSMJM-ADEu{XJC3o7ShO65=E4YV4}`U~B4R ziwd9)+(0ptVi+4TL@VWeN$N_kP`bjh%# za;v-zeGqz@Z8r2YGLm(En~%GFHDhnb(bcl`^^#g#B3wRL2N zY0uK==2)aNMZ;i0n>vxwsbYh&nJdc+Nl5AiKQGjju4zWGHFztlxFCPzJvD-&*`XKh zmlzp`$Q3vznJ<74U+3@%YcH-s>}fS~CqE3>mmU~go>M*dnfC9VIFC{j@s+x*lwA_eIrRyNLWK?d^xT2(JHt7-gIWGmuZIrB@(BnOxPirS zTL0;-(fQ4G%ZChCYMbpHY-(`CbwmR&>bUS-yAL+f`am98ZOLCFd;OW+CcA1?l9gqblId zu8QA)f^dF%<Uz;Bcub~KdghqlhoHo#2J?{DEL7UR|Kvq>#~PQvgXAnM zupF)TK3lnWkUPU+q2nRhr=86$D<`#L6K%Qc@!wv0JtDS1zr(b14LISayz%Q|2xO7m zD~@kSPdvg?C0^L1I`IU!{R{krCoNvXSUhK@;nVx_znQ%Qnd_s3{opWd;84Zy2hPiH zv~7lxJsojs9bKsz>SQ|>z0PvS|E*KZj}39@Z4*z(H*#yO2MeHO8VC(#mIwwtpfU;I zXC>Z$9 zRk4{Pu6Q=0JS4BxyEq5oVveX19v?jZ*ZYZTfU(I*UWJ2b?KL`3&){zhz~_Uo9~Gc( zR-XBGB=^RjLe%~BqF~nz=?Ej6+}k*Z6A~AxQociX9xaSjt@rV1XMa3VZ}09Ea~n$` z*H8J%Xmrbj&zle^Ux{ zxmL<&ZXV4&|L3FS?A(Dhon0Bmj8+w|nQ5qL;Sh%n;9N0JuYhYs9%nSV1j7#Q0?1if zzIv&PdqBX}(`#+1;?{pY%2*0~RO?rgxBP3Gsme!P4q$SfT|W}UcC5+l0edcy-hziU zFH@QIJ4-w=A+zlclF}dW2}=ji^^?v8)$H>A_djaT?4x5Cs@1PvIxSxK=0cRHI*rJO zo;YNw;dP-5jbW}!&yE9)NyFoJWnc!pmbb&v+#}&-ThAT5)#|s54G!6a7jp%C1~Mi}hdDQtZW!mfKISb%==Q*LtlUBacCQ?cWb~2Q`S9y+-rb z`kuHCwm|#r&h4u4C8;Pjul7vC*Z>gEK+UM2Pkp^p^+X-3-g^HZdL3 z(#2X%Ev}!6FEUm?jY7scIA|$?pG%Hb)=sCqlNVWB!xs(K-`-3KH0R3cmuf66EZb;< zg3wnjLQ#M{Zxkt(V7M>|eTc(&!f(B^z|?0x%R)1!|KmXTw4G0EWoaZM3+^J-*hW=( z1({xp&Y_dP)_&om*^+oJ18aK_N6QQLew_=@&+VpOaTX`-QmgO&P$nUCh-!ulL>KJ) zeCtid^HrjvqL?Mus;G@Nhy3dUSdop>yyNB$D%2rsIO1fr+m-ivZZilo?W>O@)(!(> zm+1QVR3m{*>A)b>6O8gsDBXJrO__u-kt0Qve(3LWWcwLyej&2wSB%<6&ZMdR^XZh$ zMD0#0gNSLZVrpx)bAFpHA-v1GZy1P&0t2rbj+S>_o%kdaI{9yRW70KVi)hF?(%qmh z%ZWIEIuB=+2t_iR(W<(d) zNHO*BAHL1EN#!zMe&c7nIMeSW-P%F1R!QHy3GSm5{wJr=`aQ6WPcB`nC-?x2$#P$h z{e76qxI76@x2bI1{P;dY;hY*bQ@*6m5gjdCRJjf!Gcn7sIMH0U zwtMUKiDNq89HgqQ0=6Ze{kWVnCB^IuKgo8*H=k&w86bnZ+;#* zzgjKXv(=mEo&(kq{N(b*B~|DJH=8)JZpEFex#Qt**)f!tGe5tw^0qAwT#AD*{RjJZ z^aDXttV@lqHKBwfUoS@%wbM||pOp`;?4tEK2;jHw2}l(*aCiE5ZzgS)a^7n>6ZhJ* zjBx6XH2*?=lL`yTsmBi$6y8?;YmT&tQFq6c)! z?wN2GdyU05-=;2Lw!Uc}D<7LnkjoDvX`*!$+Ug}3dv5hDr?KlmrE_d#WCT9%MwfdL zdc5mJwifGP134&bKUp4EV$wRr_mS z_1|=#1H#7DDEYe@5+Vb-gtZ(>+hyw392gj_lD}KqfU#g*@o7d!C2ycYR}~e@uUpJ^ zAxS1s_&dLpiFQwsP8iD;dY4oX0a&{`KMLAj-LCnRUv>mFLNlQ$ufX?v%=uLcuE>tT zYhs30)~vYt`tM|c-^t@<|8$Qm3UrOYQ)G4$5gq-}uNWIg(9bna?~R&%wifv;Gas4e zl6p+exy-rKXRTbleCW}M`n_opg&m-c48H&Hp|(&T>Y^u<7H&eJL{TFTAu!oEd%Iu% zOuWK=1ffe!qM7ajHrst+P!(vX76ZO|zmtc9*zw{z7wy84rKvuyBSmKOP#8SFZdc0D zg$cX&JCmSs7gco9M}C{=;`mSZF_9P}X0I;OK#w)4T~e0xZoV6@89UpC-|ttIhws+= zi`j&BUf4)PsAJ8JV#Vepic?s5pfKJ)?dsUWo0Ufb@gG-4bh9`^jTHT@eD7x|4f-do ztreW>ot*9~>eQ5$mRh!cxGKNtg_1X;j*jz4VQM~I`#(!Z*Y8tf(Z5)SyJK-_vyMWq zO^xU_Y7sxY*LIv<&Mr3D@utdnm!o}Or6kdL2@jhLN}@z)edN9F8r%NtEvUW)hBq-Y zRY@d1cRe!DmH?s)9pYZ1W<5xMj_S!ywVKo*JU;^WFGC&55qVRFx`cLa%4r6{<;E8k z_fPWRky~J|tF-pX9#K^$n?ira^Vak3SnS*Fb9W@riyV?sQ4qr}C_He;uk%BQcEqVznK{*@*EtikUu#~q_#hb!W2tp(q$)9!{Z8mImXcJgVsbM5LoxpU9M@n|A-CbHLb zrF%os2lUsUBm&j6Er>sVjm*)dF(=d=}|rE1;;Pb^IK1P?DK$^@Y#gc zee9(3ny}Ut{2(*`5KI1Q@9~XN$>nu7S!jE(;BCJ8k?wlnRg|x8xhI^^H8t`(4}Y~` z)Qo>k8HLSKBQs|?8%vAY&hHiGkYB;g`+BbZgUldi6Z7s%Nl7uzyIlsOut~o*;RBQD z-Du}1h^2;&lNXo4Rh!4^JW7A!vQjRwdvz`c62%J4Z;ro9n>EQV({lPZfrj8<@j9i< z`Ss|-O*-AjJ?j}dT88u?3kMduWA7wJCNAeJEdniqm#dnZnn7TYb)TDbQ*5m8h^=Z= z^j_?glPRCkP*)^UUAa9aq0W-h=sDdJ7(X32>FoOatJ#znp2E9>U_aj-U$h_L(Ne$2 z(L!L4Z@8Zt{o2Ab9uch&HSV_CL87O#T6m`vmGs5X6(*_Xp&VR^G?-a=Ne%5+a5dHO z+wYPc1>ecs+|+cj=7F*mu?$-P*D4iU5JZSVtFIAyO@B5&y2Ej_ZRR|J)m%-cfWYvC z#07$q?)N&5uBZ6pn^OxO9Rl@>o-gg9b-j(B)#$?g<*M)Hf-qUXEyudChySNr;S>K^ zA5#&r8?-r}Kw)Yf0OVFu?IETVJ}jtd5m!JD2tHkdj9y%XQpfXXKcW{XWg_F#{%gnzc|oJJqecq`%DRMt!Mi7RF!OM&G)`q%D_?@z( zRbm-iG3_`Ry{1=ECZ1SxZ2ahYfQ|;pwCiY)R*t!ohOZTvg#efp zCR>W>T8iB1(A0n?-&)+%F#UD7>p-BEzOno!Ln#){>oX>-LP-69=qFh2=JQ1*)#{DS zxA|RGg~H2|&ZQq8CdJrqF?*0iE1nRAz?maD}V&-?al z<;miF&F9VnDkl`UeP{fxdb2R7c@VRM3!3Kxj#DFxVGOcF^)zqAErtf~_x|c0MIn+P zLr5rV=9J~gqy9Gr;1qGitK8&nLci7Mh#&$8Ue zYBsMdeG_77M1XMOV+(ASdi+|FGiHaKJf(bw`r>7ecDH7YH zzP9m*k<;}ZZb@^1H{L?nI&LbHyFJ{>V!HJwZx%=Kyx^Pu4$9t@5rtoDZAOytQZd+G zz^%z{b!twr*-G>$u=u2uTrU3C)u^rOp(rr5lA05GR~V53?bi!xNE_39{-Wn=^Pi=O zli)Xp(!wzTy-JMJjpQQO5-!8Zr2YKtdbtl#P&lbHr_rX5h{;_)O-Y{80oP)o7KX$1X+FUicH1-G$xUyxwx?N8Dg)!K;h7 zv{CeZEMvpYyOf1`M814V;Pvmg_{hjrM?@FZgo?=L;X|7Dh88TS<}3CG2T>G|ad95v zjf$=t@d-RQ_`?qt2=))Twfx5P$hi?s+E8zkwOfLhB+>Pd{es(oGpMb8i~~No_GYDn zq!A5)JdI5BhBtKXO7SF<`MxsJ%cq>K*Y~gGRIJB+7K)O9bZ7I_)Lhp*h>N9*2{^ds zM(w!%4F;MKc!SKM*JuEZuBToof&yhP^IFHC{w%>?oEA5Y+ve1*?Au|G>ub+rc9#V( zKrZOq$EyH7cmD7|(Co=2#pmVnRL+dZFCeh6D;zIimU<_AIXNmi?%FOdM&y`_W9VD+ zo3Z3|_67W74`F8h<KZbuS_ROJAE!tvgzt_ECzS`)Q~SI8;94QR6!o-O`KH2C1m+Q!k3l_?n5P(Y&N` zFbcm#X-laxQ@a&HfKpR>^$~SEgNwK%aKF@@&y`3f2s!bLUd`#>VMEYfQ~nJ-lpFYv z@R@AOn-N65%#rqx`=tu_N}3*Kv&dN^N!GiRx3SSBW+rBFYSZ;uV+U;8*52*O@ch8i zQ>>8t14s5^ygFM4g`idHOJa;dMqVV?Q{lOW6k1F>ywiU`|0M70q_$5=C{UIMCc0|o zX#0>BnNZ!Y8&AqZ7s^JeyfadG#QW*(DE8Nt-j>6MS)n7SKfiP)ORcYmhU!li~rLdZAGf-7j%w!(8+mcOiXOjf752=i{Jsug9TSE@pLiqw83f*%Sfmtv8T*WX4v zOE3W6Oy=^{+k|$v#3m4EXPMM^a0A+NR{?f9Sh%Mw1z4{EBJ^kJp%v!6J6Mw|QS z6$ryIQ;`>_L|@3;vc^gwqmUH_(1!o+Epbb0rKZW#GH2lJ%CtT_ zvK%$DBu4nt>YZ{RaRAoF4#s4`L}!K|7ychX5tv>Wzq#|_@>gm}T-tiQ;H~rpxpWh@ zWvM@e&_HifhH{vXWTT>s&Qtt9&+${mu**Zu`g^+Z-%B_&{p9&frq6dX2HYUwZJNsC zCii7pyP8fB+S|o3DNq;~5FagZsSWs*gt^>h%3&=M)87K(n~{?e(p$2hR|za}&kKOY z9?RSu=Zh{Z`!Ak$CP@bTjD?#91r;<@iS=6zCHuq9Gad+hert6%8HRBzyL5KNaw2Q8nmN~z*!(Y@jJ7bNP#$w)5BLXvvj7K42LFc`^2w2w_ z$1^pR`^%&IB{!(bu19c)Q9wl9W_FV)v&6OY!Fnb=+`hptpB{R3+sx%<%#ZCmr+vqs z)~aL-EphmFha*uR{?NWEfXK8xm1)qz>+ zH1AxSsMeN|+I$eOuuJ~aCl<)*uez6dExbC}AgabYi*;r9MOBZ$!?*T#lZzbIbym-K zwR%M~FDpjiroV2ZugP$Y>@m|pj-@!=r53x#w8cX6tFhOZRuF-M=m!BSYio4htTJTO zLyb>5bNyb~oyE3*{~o%-CQ$?0T+P{;ncEv}zib3}5h1LsJI)p_;kRjKU){!kD}u?A zQo+)WdZjiC*LNdItu+;#kZNEFFMXTNETZe))@wGuz0%{{R$TrX3Kb;-pf{jAPj?Oc z`CMz!R`Ofvn?k7P>CDb1)EXCDt|Yx)K4hAdrFBNdgvqwl-oN&e-)OV`7=0J0Ks0Nu zVAYioUh?(*;EP>!L(1W_J`XF3kXHUhkX3VgJJb^evbX}wK{jStFOh22jPmt@Cj>SU8;HNXm3TF$QD!Lq z3W8qL69suxcQlx4T1xA+1qXLmpGP&)V_bh1GD8e#UCcIAfnjAF%UCbt3{EQ)QH&zq z`QA-lX}rppK#sfQQPbpwdN8-m7!WnSej*KSd4yy6r!H?Crz}8P$^C zJQI&amOc(Y<2`8Hs;lMgQxV-)ehOA$rHsw`al!1spJI+q{JpFen;t20d4--2xxME! zB2$+{8T>*XN`>+Rv3~J~5bVbE78p$G15Ly_JoY?LMn-C z4@eeeCXhB-ZBnJzor=2?6q%?wBTOBci_x8Ll$bEgia4zKvf~PX8)-bnYO1Outmd4z zrCp`Dd97ZvGWE3?f2BW6ueBGkP3t@qkI~JOwFN0DO%Pi( zc%*E=fnTcpDOQOQ_`@PuKWbGTmyqyt>?xTO* z*uU%KW_AJQzv62Jz#Mi6Z|kQ3P5rtbo8d-&;N%&w8CDa{h2RpL0F97N3<(L583Z!9 zvdt<;I{M~iqtTHsbi+@`P&t3-a;4Nm;c;VKf^EBY#mRFnH6=CzQT)uLFJ4>H zn_14frKsz0@jd5ef6lCbcKKZzQlgW;C{Fs`gSLWuH!?wRr=MaY_@<1ph0S=Q8X`;W zO!f5id=bmgWZkb(`wZ^RS<%CH!7r)3k^w9@i9l9;`ZW9I4vUag4sY8;9{Vopd$!1E zaIVjn*wPp&PVOs+C8GzJ?-?-B_4|B_{smR2lk@rj!?r{{Zr*wW&6%j@L{#Iu;u%|V zxeMb+Op(}!qN~mVd10Lwd^(rQcQwg_vj$#mXg&8A{&zt~o@d{G+zty*)@)NXek{AsE>5E38-Y*D+&B<&v9e0QQ)zPPq6+6^4y#j) zfF=QLg+~>4c&P@Q9S!aVXHV5PRiTFOz)P1JolX3Ih6V}iQR;SB94OOE5lu%a zOEQ~HhLInwzuqT|Czzu=`s3^0TH?*iZ5BK1a1ZLpCiYScls8j6MWPr<$kaN!q~b+k z%vEa^h@LSMsIs+(X8YVn$fR0l%xP<7Lkjw8GLKU{)NDxmv^Y{WYa|?B@BsR1Y5%Q` z16B4n`nmK8^jgcDnESX5cV}Gzfw(@Ux~6plUkkHHm_L5kYKZWpdFvfyUAssC|3Etc zaEYFN&95Q06MdC4T^gz~24)|FZ#+w^G~oyTzBs;C2aZGf70dr((U^8J5NJ8RH=>_O zALK1xuih@k5E8>M-!YMI<*Y3}&AGX4)^h*?sepbch?w71(GN76d7zMmHQL|U z`9GiBe40f!=4Br$e>^uUM;A$*?^jiYx~V92*u94v${JNhgYCU9BbY(9p zOD2wDd=e=hnPfuYgM64gv4*9~O&)DwhYuw0a*jGPrWNFHfakO;8Ta6H?!l>+bP zEh_9D#Fb^Idc98u1h~Kzo57}AV48iHmx zZo+GU>p$yPS%VYczX}TlEuzr!Zq`}tB?bX;-`mjb2h%3plI~eId6Jiqy$$*?^s4k) zzUqGO(Ywx`%)-;fu`uz%=vC9mo>k1b)^K{d&=o3vT%3uyPeb7rtxPDnyxjQ3_nM4= zRO2mRkDjKcCT_zx_i*_t>S8?Nt&-tKZqSyD&QU1|4ptB&3D`wbmB#_}Peq z0@6IyFVppZm@aylkJbTD6l1JoxUa>L`CKtO{6q^xlJ$OJ$VcYvzm908`k$} z`km{zR#5eaMEm}2$wR9T45$=fA9e5VTLOq}xb#|!>+|J)VtFLN<0&(4pyGap=}iVJ zB}Eqyr2IWs+3?OHPx`^Q!qCQQlHrWq@#j9S;994*s*OCliH?3$uxDO07BdZsjnfu4 zlM%Q9IeRk1vgNLJw6*P&%cCLtXg}huL4JwGC;Ux2(d?DR!a4F)xSr|k!Vl>sa3=Pn zWQ8-V9vIftgBObi<3>ONaTzz5dA}h=5{&0w%HeZCo<`{pyc00VLV~q5uq>~|j^^E4 z9=tx|+`c&oyT3!pV`FI!JUDlMv0d3z5O=Hl2IMr28=wCy6BtJAeSYL2nZmBW19>mj zE$j9Ro2VwIP7Eja~=B_A4GDM9_$^H!*v`4t^C>c={Bh9fTON{dMYk5{b7y(wz&et8wsu( z5j06Pv;9uxs0S37oc8Y^x5=+GU(x7V&riPS*U65eCcA$@GO*rg8-K?S^aTzY20S=P zt!Ut89RT}SuH<*`p++cdMABod?q7$q!$A(G=Yt9~IzP0;z^9%ph#}CCPgn4JM=Zw? z@|<^^%M4Sh6fXR!V9LQM#jGc9gN;p5FG(M3l zM4k}=klXz$m2!V&Qv2-J_iwSh?#P2C6|?wSeb+w8Il6jm1-M*fj|REeWZPox@f&`- zB+RQBy(VHP!0z#K_3F-<&*4%RJd6^ zLn7L^{Z=@m7Ucw#`eD^yP}|`vLn?3eO!>3y--YCK%QdfLl$0_yvazqdSVa`rT5*X) z)(O-w1#Ceuh*M&h-7)4ICB?U<|uZ2WhbwwDv4|q4N+a*n#Ne;K`O(W;5*=~>4 zE9ISWdg^zBacsH#$Yv1UPJlU}s3c-^s!MIx$BZPDB}?Zl-aH__Ysa$FzZ{!!M4CCI zlvzLvMS{hZJj(p?z^q!2d&M7pDPk9W$)g@yACdmXy0OM0gmNoi;xWd(?oycF#CDyy z9l;7UX zcOgSNXt6nzi3>DI5E`igw&{O8)kU9$A9<<8$ny_DtazO1-~HD5M~-Qm0{i8}T#J46 z@?&;P`L%a;H_o+(5{ix@Qn8P5wa$wf3`>xJXvfGT<X~ClRY`IHSoX2TbWjJ`*O96p@49o&NInB34N` z!Iv248t$*rUx|$J9?$%|E7ZJ_bF+PA#FVy)(zcDkW}BFul{i?|jko^38C$V+R>~;2 z#h8aTdz|b2Y(0lBd^5%|$(k9BgUAKx@v(%qCL%$R91qT591sq7!fu#OSm+-Yit7Q9i{;5d(&>o+)b0kF_UG|WYl%EMT1RS z*8_19#24$B7-`3;tqu#^W3^A_+l{YthU!ls`=0mHO$`8K?46UMjn&FBQXWKV;`Y0L z+>nwJo)N%Q88+9DZ=GfS*l4A{(#|O5;EApf|KJv!tps)6dO71(XWy0qo5aEN`Q009 zXXU!<=jJR)*s{f@2Q`CIp+R_}w6}db*sr^|a*q#-V>b-fqGnnLW2^}I-{>pt$}V?_ zVPY4JR_BLk=I@m+tt+sAos-emgxG`I7x0;_p5in3odCh4;dtwRPw;h{3K4{cBx%}e zhWMK3%p^(um)VvkG)w6w#4%bDoyY`EC+l~se!3%*TJH8g?cBuUfv&)!9x7r!jqYGS ztI_Oe>7_jTv^acw5W+HuKxN4UJsusqwW!>tRdx2g_C&8|lvyuTPB6OPGG;Aw;{* zy7DovRf0f&lLQ~$*W)vh)A2j@e)H^ofz1c=YljItg>_Y^AFbvPy{cvJk2Y(=Wrj)zeHxG zR;;_U&}~DCsvsCpbxBp@ZCf2oq9TJdzNjaIo{I%l^WAV2HoC0=1;u>b)jWYwnf@R_NWj zRANUEpJ(pPBTXi+3w|5}4d_!Kbi8H&1<_FWd9&VAhy=q}FxgD6=3Usffs9+g%ixxM z^;%!i4UGbwWn&(t`>CR&{vNhady%B~7;C>&W>HVQLIYwTGcA8u zHREMuc1d|;5;hi@ptD3z1Hkola(mbCwPV_&EG-v2TAuEY1T21XhU|d8BIn~!F1X-; zD2DJy;@8+Kue4(9-IXAPYTC_Kjs;F#0e4y7dg*ujHH}8>JE)mk!-nbYFt&57c-mfc zQ8+WjZ2xtpAxQ*sj(Q4jBWB#Lc9XpX^$^~>a)f5c5NZ4++j%Gk@SlmD! zxXEr@z!arsF~KXE)p(D6B<^+>;gdlXvnUZsL z$owx~6@;0xuI#EdrB}=jOk&CMkK3&FcemKHfKTX=0r&o4eQNkec&WwYZHvYEFU4CO zQIyrN=I@2?TKo5J@u{aw*IU_Y{AKslpG4q7_jUP;!(s&I_%InYnV?-(B2X`$&s$6>G9Z&5?+B^i^fRcl&T0-hj&|@+;$*5qu zPWngk{pKs5y)ufO*}-C7ny)H@O%E5U{77BT z|E?-ob_g^W+83||@q6T<`hy(#5vUsBxajPj`@E0UxpT1P(31~;gpe;Ta{!I4c1!$F z-eiZ$fCZzA{_6o0W3E|^u2sJCJWfXm@O2NCicd0*-QC2fZz9rNfJYmU-#Fd37I{~O zN^!9~SO?lh%&JeNp#o9N#r*(Ta=QSt?&qHqQ==Cg6Faximp?V0#I2NZApCaR=_ZM> zGzGnjBF_l44|&o@b-Nj>F@o}88J)Om_kz~5?k-HeR_oS}Bul^4^iRoO++pI&;B|tR zSUpf`NdYBnsgP}4i2?ux!L^IWmO%a!_s{P5`P9|xTL{4wRCDJqJbqs8wQBCYP=r26 z>n<0+OXZn~5z+<+W?6LB?>9^2kDq)k8VfZg?_Bzzs^>9Mr^ID}U`br%qhQAt1+H$Db@gt&ZvE+6HAtkZ zK5L-atULmg$IHjJzus_BepN`B#R4XTTx?0AG{T<^o4(6NsnZk{>Z`?(=s?Re4515O z9Y8nMC>Y_5Y~)j8vbyNI(^NwD#T9oa>P_|P-Rd0-${N82*Or=Juv#ISy86xBhs8bn zbU^9k7hqbqmsbSbP4G{TA{N2vhAv6}cfMG+n!zSWF?HR?O&VE0G;5g1L1pb{8l#f;2STX(a7!nEB>oactMzHwuov0Y-cbGCceSP7iw>@h^m&|r=-SM3+Ju+ zdY_vjGxpB!+6H=Hd|&_YEqiU5&BKDvv2g-Y7^%wbdIAVaTF`%1uRJlxVD3HPB$2A zuwTc=_y4jN$W$9w9NKEAat$@b)%YO|a^xA1QIg&6ro(0pY+~ z2lhxsIoBzZEKQqwED7tq>x3Weq8P1`C<@UX~#NJVzKl0>S&uxCS6 zVZkp5?es`4FMPLJwTXVBPlx-!;+t2;CueQ8@=pBbIm<7!dAIWSHP6)I@l8+0r|V<+ zT9R*ePrJr0&{g*u5}V6KDf_(F))ndjA&XT}3Rh{W>E;FiD?VMf4fEY762YSFd%-Xe zk&>U@OF6$1E(GhxmBm@3BGWH)Gw+tHZ`7IuzmpZ_c2kJ$<3?m%|K;5Lv46hjy=3b< z$^=iyZh(zngn2oDU?XMK5mVh>ciQPNA|nZ^&6mM;wW|dpZ7u*^=VuKLl$Jn%G>5|P z@O99SA%n{mwNmXNT>64?q^+H|UtkmJXWJM;((_%9%zQZa1an&WYFr+P$e#Yj<}C(A z%-ymrsAz+AYHz~#;dQeO`S_8Lm5tS}s(%hv{0N&7jgssrJy>a5V=NYBuzg$SB&k0C z&V@7U3gRpP9lW$^t1*(9pH+<90wjK{@0h^i#5L-iBQd)l{C0M;EKMaTD?{}Wl}Swy zZ7f?A5>u@4VQmphkSXmqoA1LssZtwT_C&=WL+zOkYBD|bi)ig)B2*E}82hKQizHH@ zHJ6_G5e1MKomrp}GCq8-#6dmzDUbmxmgvC|7%1Z$CVZB*=N&-&nJ%;CNB1DheUn-h&*1G^GV>Rx zRid8Enc~020KBTEN8Dy!i~qRNDJyf;^q|nu<&j zF9kZiJ2C|kFTIY-T4Jn)N}c10i+eH&5ByQpG6cY8}7{Q(BY^0H!CX z7^1uzqh$9j6Sv_e5kL~^b`!nD1V!J6gBq#M)TL}RvfxMRv>0_$*})$12k?b6?hoO) z0XDFPQf$djhw=!q&HaCVd4O9g13o4u=4(wUJ8D|TIT%zu;*rBCixO8W@<>I>9euMQ zF|j(PetKu|zZ_w*Gu%)Ms-%8&hG`GZ=ZPv_HJ8QzT7oSbU!C@5X^Ia>Yd5MLMF$9_ zkh53)%jbUr4;>9K;T6NLTuYcQS@%TA%T)f>-JcD-6j67NBt%KA6w`)!9H8~Fhkn4e zdVkWou$V_iV>fQ z*h9Y*3$o1Hr)I~BkB7`I3N*(Svv9vnEtkZX9jDLrsC7gBAp5cyi2e>BJYT!(igbIr z<2=MbmQD$6N?MH!g?g?to$3~3w>Nd~Au@Vh#jrwPaEU?<`8L7xA(nOyPXh?b3W@_@!{KA z5?cFY8jA0klI0JF2O~C0?pU+|YBWzifn~`mo2MiAO}7=n%&5J~vsjG55i0@GVV0~X zlERQ7F+GkHR%(z@eS%I3+ebQq%8zj+<>7u2v3WLjEg2w!Mcc`JyS`q^_;n-GDrFwb z^LU43$)@dz9^0uOF`)WX1*(Tc1@x;@g#iWm{lg=1;vHkqS+AXf1BSe%fd!UO!1e{| z(Eizj!DmXH`ZPaBQ}nU~0+4cKxEP0%7VI+0X0G0~2Sj%1qy~QMj1~7vj ze94n9C2~M5BiJGY0}L~5SP#_)(*hfOKJ^88)W)Vknvpx>xs!zfbL>t7`Cj(v7%h&| zKyTj~M((>{L7cm`o}g8mSR(-1>v9G2!xX2OFGHxI4M_Mznenda(dE%sv($ zR@=B|z@XE+ZEv+zeYY7>X57?uhqe-zQzQ`Il$9u{!Ui3GR})x24a;dFESEIc^0Kr#FBU)KebJnd23|G3Y`tH7(*taH-g6W zuZsyO>4mXzWUyD=!}!eG@trJrQ7{OETYb8;k$s$qQwG@JwJa~PFKoCBSyg{SC+2r( zjPp1LVSRqZn0LY?4<>tnZ{F37N4QrW>o(@5Gs9@z5F*{3LiuGrNyo5Dn$=C)J2vneJ08?|N!Wqw!}~XO{sSf3d31|bv6_|d^*t|J zTr6~JdLmb#a4z{c1hzDy&Xi+#R|na#t9>>3^Z8ivM^(flTTVx&G$e!yoNI6r!%YV2#Bp5e^RMt-1~vI(bFa=u)6@oUI6nR^;`AZ zc`+*g1OA?7YJSs~4|hW|GxJWsg7hjqYg}LK>#WZ$j?KRB+A-3`MEjxk$`(|tR4PW$ zz?KiR?ulr?SgU@Us)$us^i00$ttzN_4P<49q3Unou%s_&y8KzdUK<1^>lF1!)gw3J zQL-SDW%*F*P@W6uyn3B0^>+w$(dV)+6-he|^+6S7nQZn`rG=|i2t|_ENgeF1{nw{s zQ57LW1Gn~dR|>Acb};~B21*oPHaTw{A6aX_fY^B%N*sm_)_RpEZ#M!3&SW*72k2as z+SND9Ep*q|@FGo2iQdU`6hJ@pqb!Fv`4m zq1Uz`7&q5#^PJZ8TrFh+lNkz+bRU9onWyplfCt`4?hL`)4FWPm3y*=dc{ zGk*HiE?MeCWQ0>pV}J>l#g#h4r-<$3Ovjl)i^v`zk386b4w0l+0m2C!<)okS<F( z$W$r;F(*XoqhwPTYfn|hRYHL{5VnL(O;(A=@Tn~&v&Nnt-H4c-u5VJ`}6fq`y zpPN?g4Ybbuj1!tU_-?Xgl=Xb)4#iQ^zG;>|bvD<_Gy8!7;Syg03$IcGg(t<-^W(~6 zC0==qs_TRecmI|8d(Coq)4_+A1%-Lh?4UiI{>~X69ML4XA-nGf^Sj>_x!)lVwYV-| zzl@YwYxPsZq4_K664PA%*z+NTMhw0FZ&j~a37NU_)I8el)L9SE#pO7iH<|3Yaqe0^ zpIP}mtP$&AhG>sn-paWg9QDp+5S&A7_>lL9SA_U5qggZyi8!G?Cjsxc1g12g95^ zF|mb;pYEpUDIZMRCG7XoL}9$^cI47{`oqs=aLb6bc>&7hdQ?Z(@Kn8qSKzujACp@G zptc+#u1=>T{Z|~+d@ctuP zsslgwfs&qa^81S~PY+-QbBF35MQ9Dfu~_u6N1ny{X6JL-AE-t(?N3C%35T~1v=o0> zavs_n%mcJN$HY?7K3uziZ>3m=j~SpUYBh%`b?!6-s5rAwk+P)oJ8s8$#}MQGI;M!7 zt4T~DcUz9+V82+9Jp#w6`%E)4?as!D{%WeRT#9*O%vO9VKKdZm>pfD$>XgEVx&j|& z6j(7ObHI^Dmqy0V&4TxWJG~!{CGa(a*0N&G1sVeINrzI#vb^X;$CuGdY9R!ms4eSj zt85^DrPMYs?`*n_3DX0WItP>8z9CzVY*Dz;@jQ#Tsjnp+JfM|x?HjpxH2YDxDHe`Z zbuS0>6*~>bp5Ygp5_yodA5Md;EhNC$mKnbi{pP($bW^t}_j~!;Z~8y!^P{9vgHdxI z9~eaDZ^!HehZi`?gO27>C<1E_Rfnd@+u@7krx%jDd0{ak6Lki#I8hZf281w>ahwOh zWq&dZF_69&;T*FlTx3b6tB;I~D39`%GmQ=v3ThroNz_!aRxq`_@Y4Fbd#R91^-XX> z2a$=&Fghcx|J z1gw3$U=OXh$u{!IzYeAbKNm}ALpJqO?g9iJQqnp9oDiL4IV&^NmTp}f^(MSNvJEA7 zon=fdAoWdi|gH&xwDG}3saU3;-K2)v@5LO5xD?VxHH{CvDO5QsHEz?VbILa z4R?79h29#=5AKoD^TNd&Pgeh3xQeZb)%-D8^o>{|IQPffnUl|a_RkDgm(I0_oFJ|W zZ0f`2KW34g`nOJSh*niv*(qt}WO5hB8WN9f=&CXk5b86AYdgR(cr7-M#^&SPxJ|JP4bPs{|^E$|a*!+tyS#>HG5i z5YtUFDXLoG`k4~&%IN>&=`91I?wiMLHL8X@z z>6Ba=X<;RokX+cMyPMtT;P?M~-tMcSrc_-u9O(?C8pew3)Vznq7s7t9a--g`{4 zE_Ts6z_oCvSKjc`^+>)taw*5}8FSv8<)uv}EA5%dWQAqGHS0(9k%ztIV zo)fgm3K>1&zk77gD7*T7*ZC^1wl<=IjXt^7ZA5>&T(5b(Hk|lv_jkhUGcnpv9Zm00 z&W>Y0Ev$RG_udO{%Uvb^%7m=eJKDdaEc*pKBGEXYZ086sNTSWZ8DOF=o(VAyUz^VJ zG_ZH%PyQh6|4Mx_>0!)k%*$h)Tklor`_vx*mhmr;tlVOVk>7mZ`H|>-xmam~0+Lu9 z@&7*&XJ9nUw%_V!jrKU!<=jtSr(j{MrV~OF)P%oQQ)9fHf8;c~mST%M324i{>|yKF zG-I}zbsn!RPb6nEn&)lmjgR>?j*|8ef^sG7x(0AxMef&vFbkqB~ zF7oemMaYS?!v5Ea=UWfD^ti%p?gR9_bv(Qp9MYvxhfY}M$JyL-?JLh3!Mx{Akpxdx;)A0w^l!T<%DNvAPQnV{nHXj#Q7O<#d=UziUT5^#fM;r- zIgTdFaULCv$`o-0V;>1KqZBAv&y{AfCk(@`pKduK!N%k zg!O}@e0R~+?DxWLj_|?ZnbQA8DSAgWQSkr2Y4STOTsgULq>#~#RIY~gc$l`jGkQ944Vby3(J15B4;$1Rxh z?D@EhBZ|z)LHngC$6evm1)|EOgox>!bIJ~paXB*=9|>NLRAwb+`ZqnslaIp_>fz8RuF+huG)8q?Q+~j0T#~TO8;Nh*rgOC7z95 zWLWXR&LU_VP!V<+Gk9^%UxSZm4kNZWI@>jDLzMfWZpxV<^JMi0D0bcReB!HdF+l!u zYXzBo*IbebkPuseofE__J>Y(~`45C)^)!aN+1NgZZdVYViL|)&8G!qGB0NfPA&JHn z<^Kmg0^T+)y^5hMf<&t8Cmb`p``J>wLxN+&ZkOWOS2>~vC`=rWFJ`tdT}G~PApd-C z*f{Q&!0pqf&27$ca|UzlQn^mwn&99^{4(TXgXi^CI3(bW^SBUQ5x<12M?+DxQ?dnC9jF-VZW-y&a5%?}l=maNtrO{9dZu&Mh{bXq=F}VpHGJ z%b~-p$~d^%JtNGle=p-&a!U0V_AY&I4)HSN8jJ2~&T1^EgGa3c$XdzM*Mu9TmtnVX zaQJ%-ck`6yU~9|=n16SusvM#%Hk?@;BPdhH|8sY1@n#*UmxyXziG935^BLj%e-_8! zXqE>r;=D3#mp|#-4P`BhN!;CCs@zQ}?i{O6pjo3zhpF^qPnjkU=8nFd?pS}CB5PIk zJBD9I-jo&bZT_=<9$=Fume6Gn?&)D|5fES3X(#zKF(vWu(MC^RYc)y!&(17SKj+4k z*RKE>8V4sk=KL|13pDOjV@)(JG=z>g^RsI`WNF1_IIg|R1kSwk|JhqnZ_2ZcyqGT_ zx<4g|)jvC8Q)d?O47Tw;qnZS{);Fw!^UEmK(?uqM(W5&KZg$V)GaLK-q=hdAtvK$` zAlA%Mrmr+6n{3MX$0j;Y1;L@+AFEZQ=WDdEuJ8s`R9ZWpmsIM3Jnm83}DK&!CZuybaWKEV&SuBm-kFO;k)A`UAVRmwT@Bf0n zc1eL>{ccg^uXbIWY_tcrlkN9kIJt{^6R&cVgINcbI4}US2m8z2X4MprDm!IepLa}eipzD-D z)DY`8hzu)PC+x*d+hn1@*9ce3m|H=VMdpZ-2Ml5DqpWK^W5oU5*WaA+zjMuVzu1D& z$L+w>rFO5!>~V0&V^6=e)||pcr*Z@O=HtIagn}P2cj8M9;~+Ch3l0n36@QA2|0);) zT9N+UJH#{=-ynojVW#5@3Q9oWuqAwmDpJ<{kUY6Zw^I!@axr19gHsKq- zQsgl8LDv+1L!|6O(nX#>Z}Vtci&qJ!;vPx64)w^Q>^<&cKN4N2;M>x$q-cu5p8+Cu zmtvh`3v#|@MY)=U-&TT2CAGQ!^vdM}{P?}SLJN*e(NHBPmc;+aQ_WPZ&~?3*2kiF| zMnz(()+v3fk4y53JFew$&g_104AiEqY(GIHPNb7-NkkF*{jk*^#5^uyFDIHkpe zwKPpIqQx7{0NuAJeqgIU*;^ZOIQt{o(g$f4f6(B6j1da*je)$AWi521(FzdS|EP*T z08HDJ2wzjLalo_gzG5||Cf&+wbgtjx+=&S)mLq1HCKd_q!RnZ@Jz~E{qhqwse&4*% zXj!Z{g%W)9(Rh{Roh#8&|7GZ4HVaJ+=F4ig^ca1Z7% zhq$iR*8RWzPBXl4ea@Y`dpq<&8<#VSwa}{0S9*?-+(^NSmIPyw19yWa!-^U8itTrF zsg^m@c5)B>TFdQ1`)Bx&RvvN+J8Gonl?|JTF=x$x7S4`W6Y0Fvzx3D<*mp@|82JVq z5i!Zh4Qmb#TH)9%>)z|VRN~JVTXv0@g`->xv%YEnr*9|>#%y-^?(Zy|`SR^?1^sxg zu_l2|pkDO2fsIDCcLRWR;}+BM}eA$hzqu{U4w1vJ5zJ5x7o0*d5244 zw=66DcElSa*?^l~|C%xVcwzdu~ETOdOOosjP!jXEc6yBOI{bTNjPPwk-I+?9SfDx;P5r0f^#U#~8 zi7eG{dp@+_MtypDb=GV-_3x`hRier*KfX7m>#nO}Y-{EWFny6r304i_p*?rvW?FZS zpyP0l10=!sCcfzSGu>CVYZGajq7(7U!gI-@u?Woo*1M}bIpM&&tqe*J^X-U8v*!Cq z3h|Xmd#P)$dGhvWBgpK=f}Z;7?&p~q;xhz|$(EhFTJ6t5H-x;b_C=~sLO=Dt2DkLl zWgqP16k|f#+{k*J_4_yLiEclv9&NntwA*jXCA*~8PvTXwoFqWA%u=*m`^%QgmQo6~ zYo64Zyy=u&50&%TKwCrvzS*hayMl}DqH zTMHEf*tuO7M!N9dH494p4)^nQNyFiP^w{AEN|XUri~;#gD87!kSDhWYb8T{ z&YK_2LD73dkPfzwg^r-|11;vr6i3$~nO!{D?`pGur8oH^H~!wVTsJAT?2b&goa^zi z+$wR1ul2YUV88oqeX8Y)l46tExs7Hdami`d0qrC8iHq>2+ zxg0^HL5r@U{@!*@kCo_RWzm*iQvKGl1AFS4m`CkuPaQOkm0d8IwfFu_N1V^l-wJz7 z?WS)|+;)6vlOFVMd~9JIH1m8lVP&U1gcym6YiGB14yt?W+6UA1T<+5KY}`uBpLIpZ zOG9`QV@D0gHQ|pOIMbiz^*zC!*;o`9%H8UBrxqH zxD}Ma&^(~WiVFRpe5p1?^a156tn>DTG`rJ!g-lOY`%2XcXNkK-~Qm(!K~^Zy#$k;E^tUk0LDRWW6y=NHv7i<8_{@k_wjv|F*>bePZn zDg1iB&*I*KM5IJ?1CCQdg($<-C~L**0KBHwEAymmWU0vEIs}X%dWM=9t}Ks>d7+r5;5?E0 zGI4Zvs#exxgsQf|RFrSj&VvdTgvxMF`h{XgP|9=pM^1T&GPZ&{c*SKI{Z(s!PB-Me zWmpxOzwPrWjQt@5Xl;FU>R2TGGCTK@wsBQZ^w>(U`c$K@S8n3vzjt6B_w5@+?};8x zol4#3SXSQsyM^Gm9CSRR&$^S^Tuw6kE(il3n8(5`}Db z+!|)9Z?^K(CvA7Y`CN2MOI(PQOihc8p2~Wp-uOpgR~P(gNNk-=qE@GL|3W1+zcGTP z!W936AU2$E+VTvg6}adl#4@u|k&5WL?GrpDG;Q_HezO0nYtOyz^wI4DPIRP@R(zz^ zL-jb2PN^(?=Zx@wAJ4VlfAab=)4pPt=p)y^L+lV>ME(v=u%yVfoqd~1@h6X*jHdd7 zh2Qylbf|?{Ynj#C?E`a0i>WxFVXkPg4!X45ph?5<2*8ZC3w#~TB_yriTs{%V`AvR7EKH$B*~X6}p4)MwE)(@%ITFFOj1g|E zudjP6U0<@yEX<4W1K{Q%tiQUuA42B}|H%1+iy{ru^>! zsQ?_2_fzr^#|)HudR{6ze^`3*zi3B9#-`SGy92OaJ>RU)jz3SGHhT=59E{M9V@W`? zsk6a`sca}|s{+bgZ>*^7NMR~_F96tLBtG7}zOsxVIwJB?wuPtig%}Q)c9sDOhCxS8S8 z5WGkZ$^Bpg%@TdOL!2Z$muUrhhn-DtFK75==#L%M4u`jr;NlB#o=X!vY?17hllRco z2{X;eRX2@(gpqwo9Wn$44daz~Z#n=cJP$!0=EQO7s%{TxKrL6${^ay(N}5nJVc?wJG}RPHtOO z?%GF72en9BSXAGJDe($>$nUq{KRp6)@;{L>bm`f6avrMP*loIB$>FOGvoPxVWxSxj zFbcNr5_rrsS66z;w7oWkNlZbd^{(94cch~fRR!?+Gt2GV=X?a{Ad_G^q~ei!*NZ^_ zSF$Aeubl#Edy$#aGJD@Z!%vD|UL)g(UXG}Li8dV4)l0<&5$HCD7pi7*dM=)~~DZ_zcL zQNzZ9jKz4~IfxqY9`u2*7wA23182Tub7$_VVJ0Kd3?;b_owhP$V}B|;TX08<_NB8< ze`~#MA~{O28B1rapeCBMe|9?w*BkWm_1{}WIdVK>RaT97ZQ!om^3|7u(6YoavkCN& zar|Qc-+Q3fB32E2w10XqTxCh2YGr$Vc0tL501-Z8I<3T6uzJx&kZW7;OsHYKu-6TN z;bG*4O90%Plmec_LAMD{tG>Rff^RKxaclmpCRYRP4V(c*@22-&u{_HI`i))ea}Spr zHfhQvNz17EELRx;5)-n^Z4hF=Bt9HyS&X7odI^qIJXfN(?}?o1$RhRX%C1($%)JFJ z)K2Q63n*HgdflVpA5!m&*2iZkdAaljW_eOymCgkPFlx^?sZ@4%PLfbR2uXTI`0xP!#31WEl(CGjh3KbPy? ziLL-=dy`mUt5$k$rB=_75^`4n)$WiNA4yPRxG(VMH%#x&q8N=2i6q!dW`71gm*tGf z^F_ve%#+L5WU(mJup?N`#?IujKH8fESp*4y#=%hb4fSNt+qC-UkpAi_j}JOcJ6w5Q z8~Xju-~e+|VLqI+7q4|OW!ndxQ7VqMdRaQ4Qozup|39OK+?codbR71ZZAn0|gkd`- z`cKjz!1?hX+*StofLyn~U25-=j7A;wX(n7`MlxZr!g~&6wxc%Bbv(3Mz8czy=CYuJ znk};(tC~P{>T{$luWlYlAN>U$Pp^&UG>#6&wE9rX3#16~9Go^X+lr*q`Nau}X>kJ7 zf%tO^V3M3h1RrAI_F%+@8SR-+<9cDZ+XzNO>EBT@l-y@ilXzC~nyLC%u1^TDb=Zaw zOyv2$*X3WQ{f5AAH|w>2bk%AaRCDpiJW@bv}4mG{E}Nj1qxN>2Y$_RVV+)C*}^Ebnw6yTF9i>RR^3bY2~$Pn!QiW3P_)AC-`0mHTR6ghtkg7^aqi8 zvd;L&90la2SRdtmZIhW)NX@-3gF@hZiikodo=bb^@N2n8y-!#IIceLLa+f1#e1ZOT zQi@}5`H0^>t1zCr9yp$(KYdwZc|5zfxs{ZgqOXnd&&nis^uqnuI#A0K2Y_~F;*n*A#ZoB^3^38PnBO#)lIx^lDO&1Wk3{0)Sg+2r>8TnKAKLp0nbkILi35rMop#Cgqw{w%v0-HUw{MT% zLo~|L7>&K)mJrtZWhDR9E~26d3wLsCc_1V?yS4wFXXaziR3gW!WZ71nVky! zxeq@|oB+F$uD@HHCg>-$uomn&e&)w6Qfya!4j@EdZ(mj*9KCiJq{lt+E|Jv^BM2ke zdN-Y=LjjIAXyu_lzx^Ely@qF9Z7(#4yTQ8k_(W-#CTq0mNz|g9HPn1_cLXf-Nc;Po z=T{vIQ+$gBGEF9gdp8~a-x2kq6DY7ev!^=BR3NtYG`7uu6;Dtqv0tx`s320jODMR_ z%`1N0!Y;yz&*opGUNAi+e8$SvxvN8!FZ{e51Yz+bllfo%dGGD6{Z_*9s#f~aU}3Iq zvgfmD6v=PrNPfF|TEws6G3KnJ5*yW%#x&+Q;>U0iugx-Am?XJY|DO4lS7WU! zN2+w>me26(#sAy~BmX>EzJ#0cx4PBxD1zKSbYD@%<;^&4>kRpSxxC&CMXZi zQXTe?MG4}f*lBkNuxbEe=r5~Oj=XDmyuGs1ZrbklT*Fd2XY^ar^+Ra}ioHrL-i)BE zS=`_;O_^CUo7sBpPZ9z4fOiEDsjc}T^eoDv0Ws^A#ZE)T|Nfn}Xh%oK$?p@rA_jL? z?RQUW>vjx7Rr!)S)N*l)Mk5?dba~zv$FlLla){EWM+WR@RRqc&ETR8=d_(-qZha&s zQAZcCxl6&#Tg^#?E#@iO%#8UkyZ*-H%Kj|v7LGVU8k;j?XBXy?(XJRd<)y$^nW>Rn zk)^|^_TUz(-jxVs8eb$|1cdP(cY|q1Heb+(S=D?Au{WYSStI<|lYcHGlLg9|qSfAKj{VN%Kn+}TWx=B->hX^hjGNE-TK<_+ixslPM_z$i)SG{- zNCVE7?sK`66Q*YAE85-v`|4>9ZRGPpnZy)MtwAV30J*pUTyP0Q6yYfVd<|Db7QVZu|O z@$d_wT4oPqheByhBwuit}?yjQr{=k?mGhiE^g_(`FF1ZxRrLtsajh-qu-mLr8%T4Q3(CF)P74)ze#!;N_KwkTOxH$et#kgDT z`aB0Er8#QW2ne$K{oFuR=rM@;lI{!Fo@mR+O}B{c`mx$$)h_nLK9Mf0srNeB7?kNP*oesA zhM^B54$i~t>YO}O%BWx&9S*aC1(Z%aM>YsUoR3}WrMNvk-udoa2FwF(mj$FymVw^q z5Nq{PZ}tN+q8mFT1Ox!bUI*6dA%&&8a;lQS5CY1(vDS8Wa3Q?Is_9BDE z+Vd&CS!cDvEp>*HnB`A4`D$_7BffO(1hmL#NjIiwJ1&L=GFt=!wlhLe^qou{e1Jf#>*&_poso(?jp*4Ta6F$V)^Eo*lICAhAP8+@-kk=7f|f*`vn zuENvwe(6W23E<)IUB zM~0`q&9(*|V+!p|6|~Y4uvfbG$yjQuYNk-mcJW_ZHc1r_(|l?NcTKu{eOQjmY1owE zqn7GY_OdiG24x+jKVP?HQSD(8$)DRUvZ@!ONE-7(ij^Jv9~s~D@FED^xsLw(O=;7jvfmXaZ|tc1 zsJUve%&&cFS}Zj-oe!tydxs_Juj84D==lB~hqS0UDq6Btl!1RfA!xZl=xkL0nDe+96xg4gIcM ztmc{oX1#WriBhJ4B^c#rgH*@cDEM6s7n zE;B&fRNA1?^{Dwcns2T^^j_ukRyCNkjR*@ z){;k+r-Db%9ZXY8m

FewhQIRFo7BH3VeZSQ8iK2#0!t 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%0DNp;%4t- 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 From acd9f5b2b993c1cd3f91e7f4fe13786e6f126c8f Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Tue, 19 Mar 2024 16:39:16 -0800 Subject: [PATCH 42/81] add in new deployment --- .github/workflows/deploy.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c8277acc..ed6f6440 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,7 +17,6 @@ jobs: public_bucket: grfn-public-prod distribution_base_url: https://grfn.asf.alaska.edu/door/download browse_base_url: https://grfn-public-prod.asf.alaska.edu - reformat_api_url: https://services.asf.alaska.edu/geospatial/reformat cmr_base_url: https://cmr.earthdata.nasa.gov cmr_provider: ASF deploy_ref: refs/heads/prod @@ -27,11 +26,19 @@ jobs: public_bucket: grfn-public-test distribution_base_url: https://grfn-test.asf.alaska.edu/door/download browse_base_url: https://grfn-public-test.asf.alaska.edu - reformat_api_url: https://services-test.asf.alaska.edu/geospatial/reformat cmr_base_url: https://cmr.uat.earthdata.nasa.gov cmr_provider: ASF deploy_ref: refs/heads/test + - environment: ingest-dev + private_bucket: grfn-content-dev + public_bucket: grfn-public-dev + distribution_base_url: https://grfn-test.asf.alaska.edu/door/download + browse_base_url: https://grfn-public-test.asf.alaska.edu + cmr_base_url: https://cmr.uat.earthdata.nasa.gov + cmr_provider: ASF + deploy_ref: refs/heads/dev + environment: name: ${{ matrix.environment }} @@ -80,7 +87,6 @@ jobs: PublicBucket='${{ matrix.public_bucket }}' \ DistributionBaseUrl='${{ matrix.distribution_base_url }}' \ BrowseBaseUrl='${{ matrix.browse_base_url }}' \ - ReformatApiUrl='${{ matrix.reformat_api_url }}' \ DefaultResponseTopicArn='${{ secrets.DEFAULT_RESPONSE_TOPIC_ARN }}' \ DefaultResponseTopicRegion='${{ secrets.DEFAULT_RESPONSE_TOPIC_REGION }}' \ SdsAccountNumber='${{ secrets.SDS_ACCOUNT_NUMBER }}' \ From 703e9302483186cacfb063ca4aea791445253719 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Tue, 19 Mar 2024 16:50:18 -0800 Subject: [PATCH 43/81] trigger deploy workflow on merges to dev --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c8277acc..671c31b2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -5,6 +5,7 @@ on: branches: - prod - test + - dev jobs: deploy: From dc20be37e2b154685ebe7a8fa2e9149add9e43f0 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:03:26 -0800 Subject: [PATCH 44/81] Update README.md Co-authored-by: Andrew Johnston --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3ed5f489..76b1cff7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ data. * **step-function:** A step function defining the workflow to ingest a single GRFN data product. * **verify:** A Lambda function that validates the received message as well as the files and metadata in the source S3 bucket. * **ingest:** A Lambda function that copies product files from the source S3 bucket to the output S3 buckets. -* **metadata-construction:** A Lambda function that generates an ECHO 10 XML metadata file for a particular product. +* **metadata-construction:** A Lambda function that generates a CMR-compliant metadata file for a particular product. * **cmr-token** A Lambda function that generates an access token for the CMR ingest API. * **metadata-to-cmr:** A scheduled Lambda function that submits ECHO 10 XML metadata files to CMR. * **notify:** A Lambda function that sends ingest success/failure messages to the SNS response topic. From 7f49312911eee7da71f18248afb487da6f5aae54 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:03:34 -0800 Subject: [PATCH 45/81] Update README.md Co-authored-by: Andrew Johnston --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 76b1cff7..bb2ff7ac 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ data. * **ingest:** A Lambda function that copies product files from the source S3 bucket to the output S3 buckets. * **metadata-construction:** A Lambda function that generates a CMR-compliant metadata file for a particular product. * **cmr-token** A Lambda function that generates an access token for the CMR ingest API. -* **metadata-to-cmr:** A scheduled Lambda function that submits ECHO 10 XML metadata files to CMR. +* **metadata-to-cmr:** A scheduled Lambda function that submits metadata files to CMR. * **notify:** A Lambda function that sends ingest success/failure messages to the SNS response topic. # Top Level Inputs and Outputs From 61c898d817da028198780334cb673fb461db92f7 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 20 Mar 2024 10:44:28 -0800 Subject: [PATCH 46/81] add in platforms --- echo10-construction/src/echo10_construction.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 04886f9a..b4915a22 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -111,6 +111,10 @@ def render_granule_metadata(sds_metadata, config) -> dict: 'Type': 'Update', }, ], + "Platforms": + { + "items": {sds_metadata['metadata']['platform']} + } } From e98c8bf08b15044e714c03331c7623de5e370581 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 20 Mar 2024 14:13:55 -0800 Subject: [PATCH 47/81] update platforms --- echo10-construction/src/echo10_construction.py | 7 +++---- tests/data/granule.umm_json | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index b4915a22..be52c992 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -111,10 +111,9 @@ def render_granule_metadata(sds_metadata, config) -> dict: 'Type': 'Update', }, ], - "Platforms": - { - "items": {sds_metadata['metadata']['platform']} - } + "Platforms": { + sds_metadata['metadata']['platform'] + } } diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 82be0cb8..9749baa0 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -133,4 +133,8 @@ "Type": "Update" } ] + "Platforms": {[ + "Sentinel-1A", + "Sentinel-1A"] + } } From 11c64eb5117055ef1b1282ae4b1d6e539a250136 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 20 Mar 2024 14:16:05 -0800 Subject: [PATCH 48/81] turn into a list --- echo10-construction/src/echo10_construction.py | 4 +--- tests/data/granule.umm_json | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index be52c992..b2eb0f03 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -111,9 +111,7 @@ def render_granule_metadata(sds_metadata, config) -> dict: 'Type': 'Update', }, ], - "Platforms": { - sds_metadata['metadata']['platform'] - } + "Platforms": sds_metadata['metadata']['platform'] } diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 9749baa0..37134583 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -132,9 +132,9 @@ "Date": "2024-03-02T22:12:36.000Z", "Type": "Update" } - ] - "Platforms": {[ + ], + "Platforms": [ "Sentinel-1A", - "Sentinel-1A"] - } + "Sentinel-1A" + ] } From 1919315bddf3fb7f0b60fa6e41ed9ad942951000 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Wed, 20 Mar 2024 14:38:28 -0800 Subject: [PATCH 49/81] add all easy peasy attributes --- echo10-construction/src/echo10_construction.py | 13 ++++++++++++- tests/data/granule.umm_json | 17 ++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index b2eb0f03..79b83123 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -111,7 +111,18 @@ def render_granule_metadata(sds_metadata, config) -> dict: 'Type': 'Update', }, ], - "Platforms": sds_metadata['metadata']['platform'] + "Platforms": sds_metadata['metadata']['platform'], + "OrbitDirectionTypeEnum": sds_metadata['metadata']['orbit_direction'][0].upper(), + "InputGranules": sds_metadata['metadata']['reference_scenes'] + sds_metadata['metadata']['secondary_scenes'], + "AdditionalAttributes": { + "ASCENDING_DESCENDING": sds_metadata['metadata']['orbit_direction'], + "BEAM_MODE": sds_metadata['metadata']['beam_mode'], + "POLARIZATION": sds_metadata['metadata']['polarization'], + "PERPENDICULAR_BASELINE": sds_metadata['metadata']['perpendicular_baseline'], + "VERSION": sds_metadata['metadata']['version'], + "FRAME_NUMBER": sds_metadata['metadata']['frame_number'], + "TEMPORAL_BASELINE_DAYS": sds_metadata['metadata']['temporal_baseline_days'] + } } diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 37134583..6ec3954c 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -136,5 +136,20 @@ "Platforms": [ "Sentinel-1A", "Sentinel-1A" - ] + ], + "OrbitDirectionTypeEnum": "D", + "InputGranules": ["S1A_IW_SLC__1SDV_20240212T032621_20240212T032649_052520_065A36_7976", + "S1A_IW_SLC__1SDV_20240212T032646_20240212T032714_052520_065A36_4F51", + "S1A_IW_SLC__1SDV_20240107T032622_20240107T032650_051995_06487A_6B83", + "S1A_IW_SLC__1SDV_20240107T032648_20240107T032715_051995_06487A_DBAE" + ], + "AdditionalAttributes": { + "ASCENDING_DESCENDING": "descending", + "BEAM_MODE": "IW", + "POLARIZATION": "VV", + "PERPENDICULAR_BASELINE": 56.0596, + "VERSION": "3.0.0", + "FRAME_NUMBER": 19116, + "TEMPORAL_BASELINE_DAYS": 36 + } } From 40805d9a14e48db74d6f5fa50cbad218f9563728 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 14:13:38 -0800 Subject: [PATCH 50/81] fix additional attributes --- echo10-construction/src/echo10_construction.py | 18 +++++++++--------- tests/data/granule.umm_json | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 79b83123..1ef22a5c 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -114,15 +114,15 @@ def render_granule_metadata(sds_metadata, config) -> dict: "Platforms": sds_metadata['metadata']['platform'], "OrbitDirectionTypeEnum": sds_metadata['metadata']['orbit_direction'][0].upper(), "InputGranules": sds_metadata['metadata']['reference_scenes'] + sds_metadata['metadata']['secondary_scenes'], - "AdditionalAttributes": { - "ASCENDING_DESCENDING": sds_metadata['metadata']['orbit_direction'], - "BEAM_MODE": sds_metadata['metadata']['beam_mode'], - "POLARIZATION": sds_metadata['metadata']['polarization'], - "PERPENDICULAR_BASELINE": sds_metadata['metadata']['perpendicular_baseline'], - "VERSION": sds_metadata['metadata']['version'], - "FRAME_NUMBER": sds_metadata['metadata']['frame_number'], - "TEMPORAL_BASELINE_DAYS": sds_metadata['metadata']['temporal_baseline_days'] - } + "AdditionalAttributes": [ + {"Name": "ASCENDING_DESCENDING", "Values": [sds_metadata['metadata']['orbit_direction']]}, + {"Name": "BEAM_MODE", "Values": [sds_metadata['metadata']['beam_mode']]}, + {"Name": "POLARIZATION", "Values": [sds_metadata['metadata']['polarization']]}, + {"Name": "PERPENDICULAR_BASELINE", "Values": [sds_metadata['metadata']['perpendicular_baseline']]}, + {"Name": "VERSION", "Values": [sds_metadata['metadata']['version']]}, + {"Name": "FRAME_NUMBER", "Values": [sds_metadata['metadata']['frame_number']]}, + {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [sds_metadata['metadata']['temporal_baseline_days']]} + ] } diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 6ec3954c..1d0597c7 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -143,13 +143,13 @@ "S1A_IW_SLC__1SDV_20240107T032622_20240107T032650_051995_06487A_6B83", "S1A_IW_SLC__1SDV_20240107T032648_20240107T032715_051995_06487A_DBAE" ], - "AdditionalAttributes": { - "ASCENDING_DESCENDING": "descending", - "BEAM_MODE": "IW", - "POLARIZATION": "VV", - "PERPENDICULAR_BASELINE": 56.0596, - "VERSION": "3.0.0", - "FRAME_NUMBER": 19116, - "TEMPORAL_BASELINE_DAYS": 36 - } + "AdditionalAttributes": [ + {"Name": "ASCENDING_DESCENDING", "Values": ["descending"]}, + {"Name": "BEAM_MODE", "Values": ["IW"]}, + {"Name": "POLARIZATION", "Values": ["VV"]}, + {"Name": "PERPENDICULAR_BASELINE", "Values": [56.0596]}, + {"Name": "VERSION", "Values": ["3.0.0"]}, + {"Name": "FRAME_NUMBER", "Values": [19116]}, + {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [36]} + ] } From 3f33c081a758292d79ed7d5b3c72b072cb548129 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 21 Mar 2024 14:41:30 -0800 Subject: [PATCH 51/81] update verify metadata schema for v3 products only --- tests/data/sds_metadata.json | 21 --------------------- verify/src/metadata_schema.json | 26 +++----------------------- 2 files changed, 3 insertions(+), 44 deletions(-) diff --git a/tests/data/sds_metadata.json b/tests/data/sds_metadata.json index c0cc1b5e..125b2326 100644 --- a/tests/data/sds_metadata.json +++ b/tests/data/sds_metadata.json @@ -94,24 +94,6 @@ "creation_timestamp": "2024-03-02T15:10:21.482183Z", "version": "3.0.0", "metadata": { - "ogr_bbox": [ - [ - 37.61699395524997, - 35.92252341193061 - ], - [ - 40.798970046585445, - 35.92252341193061 - ], - [ - 40.798970046585445, - 37.672665438632244 - ], - [ - 37.61699395524997, - 37.672665438632244 - ] - ], "reference_scenes": [ "S1A_IW_SLC__1SDV_20240212T032621_20240212T032649_052520_065A36_7976", "S1A_IW_SLC__1SDV_20240212T032646_20240212T032714_052520_065A36_4F51" @@ -134,10 +116,7 @@ ], "beam_mode": "IW", "orbit_direction": "descending", - "dataset_type": "slc", - "product_type": "interferogram", "polarization": "VV", - "look_direction": "right", "track_number": 123, "perpendicular_baseline": 56.0596, "frame_number": 19116 diff --git a/verify/src/metadata_schema.json b/verify/src/metadata_schema.json index c8b057d1..7376d996 100644 --- a/verify/src/metadata_schema.json +++ b/verify/src/metadata_schema.json @@ -45,7 +45,6 @@ "metadata": { "type": "object", "required": [ - "ogr_bbox", "reference_scenes", "secondary_scenes", "sensing_start", @@ -54,22 +53,13 @@ "platform", "beam_mode", "orbit_direction", - "dataset_type", - "product_type", "polarization", - "look_direction", "track_number", - "perpendicular_baseline" + "perpendicular_baseline", + "temporal_baseline_days", + "frame_number" ], "properties": { - "ogr_bbox": { - "type": "array", - "minItems": 4, - "maxItems": 4, - "items": { - "#ref": "#/definitions/coordinate" - } - }, "reference_scenes": { "$ref": "#/definitions/granule_list" }, @@ -106,20 +96,10 @@ "type": "string", "enum": ["ascending", "descending"] }, - "dataset_type": { - "type": "string" - }, - "product_type": { - "type": "string" - }, "polarization": { "type": "string", "enum": ["VV", "HH", "VV+VH", "HH+HV"] }, - "look_direction": { - "type": "string", - "enum": ["right", "left"] - }, "track_number": { "type": "integer", "minimum": 1, From f7b26a13c724967200b6c3b006048df7103df448 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 14:44:50 -0800 Subject: [PATCH 52/81] update platforms --- .../src/echo10_construction.py | 25 +++++++++++++++++-- tests/data/granule.umm_json | 19 +++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 1ef22a5c..d465fe6b 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -4,6 +4,7 @@ from logging import getLogger import boto3 +import numpy as np log = getLogger() log.setLevel('INFO') @@ -55,6 +56,26 @@ def format_polygon(polygon): return coordinates +def format_platforms(metadata): + platforms = [] + for platform in np.unique(metadata['platform']): + platforms.append( + { + "ShortName": platform.upper(), + "Instruments": [ + { + "ShortName": f"{platform.upper()} C-Band SAR", + "ComposedOf": [ + { + "ShortName": metadata["beam_mode"] + } + ] + } + ] + } + ) + return platforms + def render_granule_metadata(sds_metadata, config) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'] @@ -111,12 +132,12 @@ def render_granule_metadata(sds_metadata, config) -> dict: 'Type': 'Update', }, ], - "Platforms": sds_metadata['metadata']['platform'], + "Platforms": format_platforms(sds_metadata['metadata']), "OrbitDirectionTypeEnum": sds_metadata['metadata']['orbit_direction'][0].upper(), "InputGranules": sds_metadata['metadata']['reference_scenes'] + sds_metadata['metadata']['secondary_scenes'], "AdditionalAttributes": [ {"Name": "ASCENDING_DESCENDING", "Values": [sds_metadata['metadata']['orbit_direction']]}, - {"Name": "BEAM_MODE", "Values": [sds_metadata['metadata']['beam_mode']]}, + {"Name": "BEAM_MODE", "Values": [sds_metadata['metadata']['beam_mode']]}, {"Name": "POLARIZATION", "Values": [sds_metadata['metadata']['polarization']]}, {"Name": "PERPENDICULAR_BASELINE", "Values": [sds_metadata['metadata']['perpendicular_baseline']]}, {"Name": "VERSION", "Values": [sds_metadata['metadata']['version']]}, diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 1d0597c7..3c2ac647 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -133,10 +133,21 @@ "Type": "Update" } ], - "Platforms": [ - "Sentinel-1A", - "Sentinel-1A" - ], + "Platforms": [ + { + "ShortName": "SENTINEL-1A", + "Instruments": [ + { + "ShortName": "SENTINEL-1A C-Band SAR", + "ComposedOf": [ + { + "ShortName": "IW" + } + ] + } + ] + } + ], "OrbitDirectionTypeEnum": "D", "InputGranules": ["S1A_IW_SLC__1SDV_20240212T032621_20240212T032649_052520_065A36_7976", "S1A_IW_SLC__1SDV_20240212T032646_20240212T032714_052520_065A36_4F51", From a5a3f794c6f0e8458e5a9c3b66605ab139e89331 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 14:48:48 -0800 Subject: [PATCH 53/81] remove numpy --- echo10-construction/src/echo10_construction.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index d465fe6b..28ef0e97 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -4,7 +4,6 @@ from logging import getLogger import boto3 -import numpy as np log = getLogger() log.setLevel('INFO') @@ -58,7 +57,7 @@ def format_polygon(polygon): def format_platforms(metadata): platforms = [] - for platform in np.unique(metadata['platform']): + for platform in set(metadata['platform']): platforms.append( { "ShortName": platform.upper(), From 9f6a572a1fa4b51355bfd62d931a215d31b78f91 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Thu, 21 Mar 2024 14:50:29 -0800 Subject: [PATCH 54/81] Update tests/data/granule.umm_json Co-authored-by: Andrew Johnston --- tests/data/granule.umm_json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 3c2ac647..15d041cf 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -158,9 +158,9 @@ {"Name": "ASCENDING_DESCENDING", "Values": ["descending"]}, {"Name": "BEAM_MODE", "Values": ["IW"]}, {"Name": "POLARIZATION", "Values": ["VV"]}, - {"Name": "PERPENDICULAR_BASELINE", "Values": [56.0596]}, + {"Name": "PERPENDICULAR_BASELINE", "Values": ["56.0596"]}, {"Name": "VERSION", "Values": ["3.0.0"]}, - {"Name": "FRAME_NUMBER", "Values": [19116]}, - {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [36]} + {"Name": "FRAME_NUMBER", "Values": ["19116"]}, + {"Name": "TEMPORAL_BASELINE_DAYS", "Values": ["36"]} ] } From aba4f86228c263c7eb6109ffc616ad738affedcd Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Thu, 21 Mar 2024 14:50:39 -0800 Subject: [PATCH 55/81] Update tests/data/granule.umm_json Co-authored-by: Andrew Johnston --- tests/data/granule.umm_json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 15d041cf..1660248c 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -148,7 +148,10 @@ ] } ], - "OrbitDirectionTypeEnum": "D", + "OrbitCalculatedSpatialDomains": [ + {"OrbitNumber": 52520}, + {"OrbitNumber": 51995} + ], "InputGranules": ["S1A_IW_SLC__1SDV_20240212T032621_20240212T032649_052520_065A36_7976", "S1A_IW_SLC__1SDV_20240212T032646_20240212T032714_052520_065A36_4F51", "S1A_IW_SLC__1SDV_20240107T032622_20240107T032650_051995_06487A_6B83", From ce9f7a0808d9990593fe3131d0b7248c899b9517 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 15:09:09 -0800 Subject: [PATCH 56/81] Andrw's updates --- .../src/echo10_construction.py | 28 ++++++++----------- tests/data/granule.umm_json | 16 ++--------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 28ef0e97..a8f05c97 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -59,22 +59,13 @@ def format_platforms(metadata): platforms = [] for platform in set(metadata['platform']): platforms.append( - { - "ShortName": platform.upper(), - "Instruments": [ - { - "ShortName": f"{platform.upper()} C-Band SAR", - "ComposedOf": [ - { - "ShortName": metadata["beam_mode"] - } - ] - } - ] - } + { + "ShortName": platform + } ) return platforms + def render_granule_metadata(sds_metadata, config) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'] @@ -132,16 +123,19 @@ def render_granule_metadata(sds_metadata, config) -> dict: }, ], "Platforms": format_platforms(sds_metadata['metadata']), - "OrbitDirectionTypeEnum": sds_metadata['metadata']['orbit_direction'][0].upper(), + "OrbitCalculatedSpatialDomains": [ + {"OrbitNumber": sds_metadata['metadata']['orbit_number'][0]}, + {"OrbitNumber": sds_metadata['metadata']['orbit_number'][1]} + ], "InputGranules": sds_metadata['metadata']['reference_scenes'] + sds_metadata['metadata']['secondary_scenes'], "AdditionalAttributes": [ {"Name": "ASCENDING_DESCENDING", "Values": [sds_metadata['metadata']['orbit_direction']]}, {"Name": "BEAM_MODE", "Values": [sds_metadata['metadata']['beam_mode']]}, {"Name": "POLARIZATION", "Values": [sds_metadata['metadata']['polarization']]}, - {"Name": "PERPENDICULAR_BASELINE", "Values": [sds_metadata['metadata']['perpendicular_baseline']]}, + {"Name": "PERPENDICULAR_BASELINE", "Values": [str(sds_metadata['metadata']['perpendicular_baseline'])]}, {"Name": "VERSION", "Values": [sds_metadata['metadata']['version']]}, - {"Name": "FRAME_NUMBER", "Values": [sds_metadata['metadata']['frame_number']]}, - {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [sds_metadata['metadata']['temporal_baseline_days']]} + {"Name": "FRAME_NUMBER", "Values": [str(sds_metadata['metadata']['frame_number'])]}, + {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [str(sds_metadata['metadata']['temporal_baseline_days'])]} ] } diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 1660248c..de5566a1 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -134,19 +134,9 @@ } ], "Platforms": [ - { - "ShortName": "SENTINEL-1A", - "Instruments": [ - { - "ShortName": "SENTINEL-1A C-Band SAR", - "ComposedOf": [ - { - "ShortName": "IW" - } - ] - } - ] - } + { + "ShortName": "Sentinel-1A" + } ], "OrbitCalculatedSpatialDomains": [ {"OrbitNumber": 52520}, From 816e5b0630c2e1b95c91db9e87f51dd275e1a642 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 15:11:29 -0800 Subject: [PATCH 57/81] outdent --- echo10-construction/src/echo10_construction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index a8f05c97..d22df578 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -63,7 +63,7 @@ def format_platforms(metadata): "ShortName": platform } ) - return platforms + return platforms def render_granule_metadata(sds_metadata, config) -> dict: From e5b1f1f4966773226433e0b006d9108c229077fc Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:15:03 -0800 Subject: [PATCH 58/81] Update echo10-construction/src/echo10_construction.py Co-authored-by: Andrew Johnston --- echo10-construction/src/echo10_construction.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index d22df578..8b8d907d 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -122,7 +122,9 @@ def render_granule_metadata(sds_metadata, config) -> dict: 'Type': 'Update', }, ], - "Platforms": format_platforms(sds_metadata['metadata']), + "Platforms": [ + {"ShortName": platform} for platform in set(sds_metadata['metadata']['platform']) + ], "OrbitCalculatedSpatialDomains": [ {"OrbitNumber": sds_metadata['metadata']['orbit_number'][0]}, {"OrbitNumber": sds_metadata['metadata']['orbit_number'][1]} From cf917c18ab58bca48f00487f3d09ecdf92187309 Mon Sep 17 00:00:00 2001 From: Jacquelyn Smale <34557291+jacquelynsmale@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:16:15 -0800 Subject: [PATCH 59/81] Update echo10-construction/src/echo10_construction.py Co-authored-by: Andrew Johnston --- echo10-construction/src/echo10_construction.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 8b8d907d..5afba031 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -126,8 +126,7 @@ def render_granule_metadata(sds_metadata, config) -> dict: {"ShortName": platform} for platform in set(sds_metadata['metadata']['platform']) ], "OrbitCalculatedSpatialDomains": [ - {"OrbitNumber": sds_metadata['metadata']['orbit_number'][0]}, - {"OrbitNumber": sds_metadata['metadata']['orbit_number'][1]} + {"OrbitNumber: orbit} for orbit in sds_metadata['metadata']['orbit_number] ], "InputGranules": sds_metadata['metadata']['reference_scenes'] + sds_metadata['metadata']['secondary_scenes'], "AdditionalAttributes": [ From c758baace3c6848b0aedf8577ab919ecd851e367 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 15:18:11 -0800 Subject: [PATCH 60/81] remove old function --- echo10-construction/src/echo10_construction.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index 5afba031..b7c465f3 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -55,17 +55,6 @@ def format_polygon(polygon): return coordinates -def format_platforms(metadata): - platforms = [] - for platform in set(metadata['platform']): - platforms.append( - { - "ShortName": platform - } - ) - return platforms - - def render_granule_metadata(sds_metadata, config) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'] @@ -126,7 +115,7 @@ def render_granule_metadata(sds_metadata, config) -> dict: {"ShortName": platform} for platform in set(sds_metadata['metadata']['platform']) ], "OrbitCalculatedSpatialDomains": [ - {"OrbitNumber: orbit} for orbit in sds_metadata['metadata']['orbit_number] + {"OrbitNumber": orbit} for orbit in sds_metadata['metadata']['orbit_number'] ], "InputGranules": sds_metadata['metadata']['reference_scenes'] + sds_metadata['metadata']['secondary_scenes'], "AdditionalAttributes": [ From 66c2eba16a27e86fb334b980fcc1877585c82e60 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 21 Mar 2024 15:25:48 -0800 Subject: [PATCH 61/81] add test for DataGranule attribute --- tests/data/granule.umm_json | 11 ++++++++++- tests/test_echo10_construction.py | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 82be0cb8..6aacfd2f 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -132,5 +132,14 @@ "Date": "2024-03-02T22:12:36.000Z", "Type": "Update" } - ] + ], + "DataGranule": { + "ArchiveAndDistributionInformation": [ + "Name": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", + "SizeInBytes": 123, + "Format": "netCDF" + ], + "DayNightFlag": "Unspecified", + "ProductionDateTime": "2024-03-02T15:10:21.482183Z" + } } diff --git a/tests/test_echo10_construction.py b/tests/test_echo10_construction.py index 71174428..727ca04c 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_echo10_construction.py @@ -60,6 +60,7 @@ def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): sds_metadata =json.loads((test_data_dir / 'sds_metadata.json').read_text()) mocker.patch('echo10_construction.get_sds_metadata', return_value=sds_metadata) + mocker.patch('echo10_construction.get_s3_file_size', return_value=123) echo10_s3_object = { 'bucket': 'ingest-test-aux', From f0d72b5d1f37691c95a32c8c4a661735b5838a31 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 21 Mar 2024 15:32:20 -0800 Subject: [PATCH 62/81] don't bother with Format field --- tests/data/granule.umm_json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 6aacfd2f..1c06298c 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -135,9 +135,10 @@ ], "DataGranule": { "ArchiveAndDistributionInformation": [ - "Name": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", - "SizeInBytes": 123, - "Format": "netCDF" + { + "Name": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", + "SizeInBytes": 123 + } ], "DayNightFlag": "Unspecified", "ProductionDateTime": "2024-03-02T15:10:21.482183Z" From 8dc34fe4c3534fbabc7692c72c134357f7152a44 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 15:59:37 -0800 Subject: [PATCH 63/81] update to pass --- echo10-construction/src/echo10_construction.py | 14 ++++++++++++-- tests/data/granule.umm_json | 2 +- tests/test_echo10_construction.py | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index b7c465f3..f87c0138 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -55,7 +55,7 @@ def format_polygon(polygon): return coordinates -def render_granule_metadata(sds_metadata, config) -> dict: +def render_granule_metadata(sds_metadata, config, products) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'] browse_url = config['granule_data']['browse_path'] @@ -111,6 +111,16 @@ def render_granule_metadata(sds_metadata, config) -> dict: 'Type': 'Update', }, ], + "DataGranule": { + "ArchiveAndDistributionInformation": [ + { + "Name": products['Key'], + "SizeInBytes": get_s3_file_size(products) + } + ], + "DayNightFlag": "Unspecified", + "ProductionDateTime": sds_metadata['creation_timestamp'] + }, "Platforms": [ {"ShortName": platform} for platform in set(sds_metadata['metadata']['platform']) ], @@ -133,7 +143,7 @@ def render_granule_metadata(sds_metadata, config) -> dict: def create_granule_echo10_in_s3(inputs, config): log.info('Creating echo10 file for %s', inputs['Product']['Key']) sds_metadata = get_sds_metadata(inputs['Metadata']) - umm_json = render_granule_metadata(sds_metadata, config) + umm_json = render_granule_metadata(sds_metadata, config, inputs['Product']) output_location = { 'bucket': config['output_bucket'], 'key': umm_json['GranuleUR'] + '.umm_json', diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 50737c89..0c22dbbc 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -137,7 +137,7 @@ "ArchiveAndDistributionInformation": [ { "Name": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", - "SizeInBytes": 123 + "SizeInBytes": 456 } ], "DayNightFlag": "Unspecified", diff --git a/tests/test_echo10_construction.py b/tests/test_echo10_construction.py index 727ca04c..1bee9fb5 100644 --- a/tests/test_echo10_construction.py +++ b/tests/test_echo10_construction.py @@ -60,7 +60,7 @@ def test_create_granule_echo10_in_s3(test_data_dir, inputs, config, mocker): sds_metadata =json.loads((test_data_dir / 'sds_metadata.json').read_text()) mocker.patch('echo10_construction.get_sds_metadata', return_value=sds_metadata) - mocker.patch('echo10_construction.get_s3_file_size', return_value=123) + mocker.patch('echo10_construction.get_s3_file_size', return_value=456) echo10_s3_object = { 'bucket': 'ingest-test-aux', From c26965817e0cd4c2ab03f8879415feec2d51b2be Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 16:06:34 -0800 Subject: [PATCH 64/81] products to product --- echo10-construction/src/echo10_construction.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/echo10-construction/src/echo10_construction.py b/echo10-construction/src/echo10_construction.py index f87c0138..baf32b93 100644 --- a/echo10-construction/src/echo10_construction.py +++ b/echo10-construction/src/echo10_construction.py @@ -55,7 +55,7 @@ def format_polygon(polygon): return coordinates -def render_granule_metadata(sds_metadata, config, products) -> dict: +def render_granule_metadata(sds_metadata, config, product) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'] browse_url = config['granule_data']['browse_path'] @@ -114,8 +114,8 @@ def render_granule_metadata(sds_metadata, config, products) -> dict: "DataGranule": { "ArchiveAndDistributionInformation": [ { - "Name": products['Key'], - "SizeInBytes": get_s3_file_size(products) + "Name": product['Key'], + "SizeInBytes": get_s3_file_size(product) } ], "DayNightFlag": "Unspecified", From dd08def3c7044ed5dc70b499ecbd1eeb53fc9334 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Thu, 21 Mar 2024 16:36:46 -0800 Subject: [PATCH 65/81] add in path number --- metadata-construction/src/metadata_construction.py | 1 + tests/data/granule.umm_json | 1 + 2 files changed, 2 insertions(+) diff --git a/metadata-construction/src/metadata_construction.py b/metadata-construction/src/metadata_construction.py index 70d8933a..e1f7944a 100644 --- a/metadata-construction/src/metadata_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -135,6 +135,7 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: {"Name": "PERPENDICULAR_BASELINE", "Values": [str(sds_metadata['metadata']['perpendicular_baseline'])]}, {"Name": "VERSION", "Values": [sds_metadata['metadata']['version']]}, {"Name": "FRAME_NUMBER", "Values": [str(sds_metadata['metadata']['frame_number'])]}, + {"Name": "PATH_NUMBER", "Values": [str(sds_metadata['metadata']['track_number'])]}, {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [str(sds_metadata['metadata']['temporal_baseline_days'])]} ] } diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json index 0c22dbbc..aa118c78 100644 --- a/tests/data/granule.umm_json +++ b/tests/data/granule.umm_json @@ -164,6 +164,7 @@ {"Name": "PERPENDICULAR_BASELINE", "Values": ["56.0596"]}, {"Name": "VERSION", "Values": ["3.0.0"]}, {"Name": "FRAME_NUMBER", "Values": ["19116"]}, + {"Name": "PATH_NUMBER", "Values": ["123"]}, {"Name": "TEMPORAL_BASELINE_DAYS", "Values": ["36"]} ] } From 5a81f322b6d9184d0dc97381edfb5d62023ed4a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:29:10 +0000 Subject: [PATCH 66/81] Bump boto3 from 1.34.65 to 1.34.68 Bumps [boto3](https://github.com/boto/boto3) from 1.34.65 to 1.34.68. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.65...1.34.68) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-echo10-construction.txt | 2 +- requirements-echo10-to-cmr.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index 580069d3..4658f1c9 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.65 +boto3==1.34.68 requests-pkcs12==1.24 diff --git a/requirements-echo10-construction.txt b/requirements-echo10-construction.txt index 0ec3c4f1..e1e9929e 100644 --- a/requirements-echo10-construction.txt +++ b/requirements-echo10-construction.txt @@ -1,3 +1,3 @@ -boto3==1.34.65 +boto3==1.34.68 Jinja2==3.1.3 shapely==2.0.3 diff --git a/requirements-echo10-to-cmr.txt b/requirements-echo10-to-cmr.txt index 3c69a571..af2fd8d9 100644 --- a/requirements-echo10-to-cmr.txt +++ b/requirements-echo10-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.65 +boto3==1.34.68 requests==2.31.0 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index 8614c7db..90d36cd4 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.65 +boto3==1.34.68 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index 8614c7db..90d36cd4 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.65 +boto3==1.34.68 diff --git a/requirements-notify.txt b/requirements-notify.txt index 8614c7db..90d36cd4 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.65 +boto3==1.34.68 diff --git a/requirements-verify.txt b/requirements-verify.txt index 162e738b..1fd894ff 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.65 +boto3==1.34.68 jsonschema==4.21.1 From 797b4fe6d017c09f36f685ee17ca23c7787652b4 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 22 Mar 2024 08:27:42 -0800 Subject: [PATCH 67/81] use .umm.json instead of .umm_json for metadata file extension --- .../src/metadata_construction.py | 2 +- tests/data/granule.umm.json | 209 ++++++++++++++++++ tests/data/granule.umm_json | 169 -------------- tests/test_metadata_construction.py | 4 +- 4 files changed, 212 insertions(+), 172 deletions(-) create mode 100644 tests/data/granule.umm.json delete mode 100644 tests/data/granule.umm_json diff --git a/metadata-construction/src/metadata_construction.py b/metadata-construction/src/metadata_construction.py index 70d8933a..e72d2c47 100644 --- a/metadata-construction/src/metadata_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -146,7 +146,7 @@ def create_granule_metadata_in_s3(inputs, config): umm_json = render_granule_metadata(sds_metadata, config, inputs['Product']) output_location = { 'bucket': config['output_bucket'], - 'key': umm_json['GranuleUR'] + '.umm_json', + 'key': umm_json['GranuleUR'] + '.umm.json', } upload_content_to_s3(output_location, json.dumps(umm_json, sort_keys=True)) diff --git a/tests/data/granule.umm.json b/tests/data/granule.umm.json new file mode 100644 index 00000000..986676b5 --- /dev/null +++ b/tests/data/granule.umm.json @@ -0,0 +1,209 @@ +{ + "MetadataSpecification": { + "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", + "Name": "UMM-G", + "Version": "1.6.5" + }, + "GranuleUR": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0", + "CollectionReference": { + "ShortName": "ARIA_S1_GUNW", + "Version": "1" + }, + "RelatedUrls": [ + { + "URL": "https://grfn-test.asf.alaska.edu/door/download/S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", + "Type": "GET DATA" + }, + { + "URL": "https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.png", + "Type": "GET RELATED VISUALIZATION" + } + ], + "TemporalExtent": { + "RangeDateTime": { + "BeginningDateTime": "2024-02-12T03:26:21.285000Z", + "EndingDateTime": "2024-02-12T03:27:14.053000Z" + } + }, + "SpatialExtent": { + "HorizontalSpatialDomain": { + "Geometry": { + "GPolygons": [ + { + "Boundary": { + "Points": [ + { + "Latitude": 35.92252341193061, + "Longitude": 39.473041057707775 + }, + { + "Latitude": 36.13651330232068, + "Longitude": 39.51836791663281 + }, + { + "Latitude": 36.002268874547816, + "Longitude": 40.43544809674256 + }, + { + "Latitude": 37.35838533475343, + "Longitude": 40.76274790474101 + }, + { + "Latitude": 37.35932440089175, + "Longitude": 40.75866504235371 + }, + { + "Latitude": 37.52515129358135, + "Longitude": 40.798970046585445 + }, + { + "Latitude": 37.672665438632244, + "Longitude": 39.83536427778569 + }, + { + "Latitude": 37.46875834003536, + "Longitude": 39.78819730789849 + }, + { + "Latitude": 37.46795488041173, + "Longitude": 39.791727200410456 + }, + { + "Latitude": 37.4391295264553, + "Longitude": 39.785100802645864 + }, + { + "Latitude": 37.510878013230325, + "Longitude": 39.29517709241584 + }, + { + "Latitude": 37.580690013230324, + "Longitude": 38.80405309241584 + }, + { + "Latitude": 37.52454535929715, + "Longitude": 38.79164966112796 + }, + { + "Latitude": 37.643205847988945, + "Longitude": 37.92590907183943 + }, + { + "Latitude": 36.277943152074116, + "Longitude": 37.64814575242416 + }, + { + "Latitude": 36.27735285568951, + "Longitude": 37.65041435955687 + }, + { + "Latitude": 36.111618275866036, + "Longitude": 37.61699395524997 + }, + { + "Latitude": 35.997073364974284, + "Longitude": 38.49576709571327 + }, + { + "Latitude": 36.056646468363866, + "Longitude": 38.50873923689982 + }, + { + "Latitude": 35.99456687090555, + "Longitude": 38.962529726360856 + }, + { + "Latitude": 35.92252341193061, + "Longitude": 39.473041057707775 + } + ] + } + } + ] + } + } + }, + "ProviderDates": [ + { + "Date": "2024-03-02T22:12:36.000Z", + "Type": "Insert" + }, + { + "Date": "2024-03-02T22:12:36.000Z", + "Type": "Update" + } + ], + "DataGranule": { + "ArchiveAndDistributionInformation": [ + { + "Name": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", + "SizeInBytes": 456 + } + ], + "DayNightFlag": "Unspecified", + "ProductionDateTime": "2024-03-02T15:10:21.482183Z" + }, + "Platforms": [ + { + "ShortName": "Sentinel-1A" + } + ], + "OrbitCalculatedSpatialDomains": [ + { + "OrbitNumber": 52520 + }, + { + "OrbitNumber": 51995 + } + ], + "InputGranules": [ + "S1A_IW_SLC__1SDV_20240212T032621_20240212T032649_052520_065A36_7976", + "S1A_IW_SLC__1SDV_20240212T032646_20240212T032714_052520_065A36_4F51", + "S1A_IW_SLC__1SDV_20240107T032622_20240107T032650_051995_06487A_6B83", + "S1A_IW_SLC__1SDV_20240107T032648_20240107T032715_051995_06487A_DBAE" + ], + "AdditionalAttributes": [ + { + "Name": "ASCENDING_DESCENDING", + "Values": [ + "descending" + ] + }, + { + "Name": "BEAM_MODE", + "Values": [ + "IW" + ] + }, + { + "Name": "POLARIZATION", + "Values": [ + "VV" + ] + }, + { + "Name": "PERPENDICULAR_BASELINE", + "Values": [ + "56.0596" + ] + }, + { + "Name": "VERSION", + "Values": [ + "3.0.0" + ] + }, + { + "Name": "FRAME_NUMBER", + "Values": [ + "19116" + ] + }, + { + "Name": "TEMPORAL_BASELINE_DAYS", + "Values": [ + "36" + ] + } + ] +} diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json deleted file mode 100644 index 0c22dbbc..00000000 --- a/tests/data/granule.umm_json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "MetadataSpecification": { - "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", - "Name": "UMM-G", - "Version": "1.6.5" - }, - "GranuleUR": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0", - "CollectionReference": { - "ShortName": "ARIA_S1_GUNW", - "Version": "1" - }, - "RelatedUrls": [ - { - "URL": "https://grfn-test.asf.alaska.edu/door/download/S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", - "Type": "GET DATA" - }, - { - "URL": "https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.png", - "Type": "GET RELATED VISUALIZATION" - } - ], - "TemporalExtent": { - "RangeDateTime": { - "BeginningDateTime": "2024-02-12T03:26:21.285000Z", - "EndingDateTime": "2024-02-12T03:27:14.053000Z" - } - }, - "SpatialExtent": { - "HorizontalSpatialDomain": { - "Geometry": { - "GPolygons": [ - { - "Boundary": { - "Points": [ - { - "Latitude": 35.92252341193061, - "Longitude": 39.473041057707775 - }, - { - "Latitude": 36.13651330232068, - "Longitude": 39.51836791663281 - }, - { - "Latitude": 36.002268874547816, - "Longitude": 40.43544809674256 - }, - { - "Latitude": 37.35838533475343, - "Longitude": 40.76274790474101 - }, - { - "Latitude": 37.35932440089175, - "Longitude": 40.75866504235371 - }, - { - "Latitude": 37.52515129358135, - "Longitude": 40.798970046585445 - }, - { - "Latitude": 37.672665438632244, - "Longitude": 39.83536427778569 - }, - { - "Latitude": 37.46875834003536, - "Longitude": 39.78819730789849 - }, - { - "Latitude": 37.46795488041173, - "Longitude": 39.791727200410456 - }, - { - "Latitude": 37.4391295264553, - "Longitude": 39.785100802645864 - }, - { - "Latitude": 37.510878013230325, - "Longitude": 39.29517709241584 - }, - { - "Latitude": 37.580690013230324, - "Longitude": 38.80405309241584 - }, - { - "Latitude": 37.52454535929715, - "Longitude": 38.79164966112796 - }, - { - "Latitude": 37.643205847988945, - "Longitude": 37.92590907183943 - }, - { - "Latitude": 36.277943152074116, - "Longitude": 37.64814575242416 - }, - { - "Latitude": 36.27735285568951, - "Longitude": 37.65041435955687 - }, - { - "Latitude": 36.111618275866036, - "Longitude": 37.61699395524997 - }, - { - "Latitude": 35.997073364974284, - "Longitude": 38.49576709571327 - }, - { - "Latitude": 36.056646468363866, - "Longitude": 38.50873923689982 - }, - { - "Latitude": 35.99456687090555, - "Longitude": 38.962529726360856 - }, - { - "Latitude": 35.92252341193061, - "Longitude": 39.473041057707775 - } - ] - } - } - ] - } - } - }, - "ProviderDates": [ - { - "Date": "2024-03-02T22:12:36.000Z", - "Type": "Insert" - }, - { - "Date": "2024-03-02T22:12:36.000Z", - "Type": "Update" - } - ], - "DataGranule": { - "ArchiveAndDistributionInformation": [ - { - "Name": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", - "SizeInBytes": 456 - } - ], - "DayNightFlag": "Unspecified", - "ProductionDateTime": "2024-03-02T15:10:21.482183Z" - }, - "Platforms": [ - { - "ShortName": "Sentinel-1A" - } - ], - "OrbitCalculatedSpatialDomains": [ - {"OrbitNumber": 52520}, - {"OrbitNumber": 51995} - ], - "InputGranules": ["S1A_IW_SLC__1SDV_20240212T032621_20240212T032649_052520_065A36_7976", - "S1A_IW_SLC__1SDV_20240212T032646_20240212T032714_052520_065A36_4F51", - "S1A_IW_SLC__1SDV_20240107T032622_20240107T032650_051995_06487A_6B83", - "S1A_IW_SLC__1SDV_20240107T032648_20240107T032715_051995_06487A_DBAE" - ], - "AdditionalAttributes": [ - {"Name": "ASCENDING_DESCENDING", "Values": ["descending"]}, - {"Name": "BEAM_MODE", "Values": ["IW"]}, - {"Name": "POLARIZATION", "Values": ["VV"]}, - {"Name": "PERPENDICULAR_BASELINE", "Values": ["56.0596"]}, - {"Name": "VERSION", "Values": ["3.0.0"]}, - {"Name": "FRAME_NUMBER", "Values": ["19116"]}, - {"Name": "TEMPORAL_BASELINE_DAYS", "Values": ["36"]} - ] -} diff --git a/tests/test_metadata_construction.py b/tests/test_metadata_construction.py index c209041d..f858901a 100644 --- a/tests/test_metadata_construction.py +++ b/tests/test_metadata_construction.py @@ -64,7 +64,7 @@ def test_create_granule_metadata_in_s3(test_data_dir, inputs, config, mocker): metadata_s3_object = { 'bucket': 'ingest-test-aux', - 'key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.umm_json', + 'key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.umm.json', } assert metadata_construction.create_granule_metadata_in_s3(inputs, config) == metadata_s3_object @@ -72,6 +72,6 @@ def test_create_granule_metadata_in_s3(test_data_dir, inputs, config, mocker): assert metadata_construction.upload_content_to_s3.mock_calls == [ unittest.mock.call( metadata_s3_object, - json.dumps(json.loads((test_data_dir / 'granule.umm_json').read_text()), sort_keys=True), + json.dumps(json.loads((test_data_dir / 'granule.umm.json').read_text()), sort_keys=True), ), ] From 210ebf5fdf075dbd6419535d6c241092f5adfbd0 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 22 Mar 2024 08:32:44 -0800 Subject: [PATCH 68/81] add maximum frame_number when verifying sds metadata file --- verify/src/metadata_schema.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/verify/src/metadata_schema.json b/verify/src/metadata_schema.json index 7376d996..d2d49503 100644 --- a/verify/src/metadata_schema.json +++ b/verify/src/metadata_schema.json @@ -128,7 +128,8 @@ }, "frame_number": { "type": "integer", - "minimum": 0 + "minimum": 0, + "maximum": 27397 } } } From 12317bfe3e4d26d0ecbaf87fcb41ff2759160665 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 22 Mar 2024 10:12:34 -0800 Subject: [PATCH 69/81] remove granule.umm_json replaced with granule.umm.json --- tests/data/granule.umm_json | 170 ------------------------------------ 1 file changed, 170 deletions(-) delete mode 100644 tests/data/granule.umm_json diff --git a/tests/data/granule.umm_json b/tests/data/granule.umm_json deleted file mode 100644 index aa118c78..00000000 --- a/tests/data/granule.umm_json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "MetadataSpecification": { - "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", - "Name": "UMM-G", - "Version": "1.6.5" - }, - "GranuleUR": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0", - "CollectionReference": { - "ShortName": "ARIA_S1_GUNW", - "Version": "1" - }, - "RelatedUrls": [ - { - "URL": "https://grfn-test.asf.alaska.edu/door/download/S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", - "Type": "GET DATA" - }, - { - "URL": "https://grfn-public-test.asf.alaska.edu/S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.png", - "Type": "GET RELATED VISUALIZATION" - } - ], - "TemporalExtent": { - "RangeDateTime": { - "BeginningDateTime": "2024-02-12T03:26:21.285000Z", - "EndingDateTime": "2024-02-12T03:27:14.053000Z" - } - }, - "SpatialExtent": { - "HorizontalSpatialDomain": { - "Geometry": { - "GPolygons": [ - { - "Boundary": { - "Points": [ - { - "Latitude": 35.92252341193061, - "Longitude": 39.473041057707775 - }, - { - "Latitude": 36.13651330232068, - "Longitude": 39.51836791663281 - }, - { - "Latitude": 36.002268874547816, - "Longitude": 40.43544809674256 - }, - { - "Latitude": 37.35838533475343, - "Longitude": 40.76274790474101 - }, - { - "Latitude": 37.35932440089175, - "Longitude": 40.75866504235371 - }, - { - "Latitude": 37.52515129358135, - "Longitude": 40.798970046585445 - }, - { - "Latitude": 37.672665438632244, - "Longitude": 39.83536427778569 - }, - { - "Latitude": 37.46875834003536, - "Longitude": 39.78819730789849 - }, - { - "Latitude": 37.46795488041173, - "Longitude": 39.791727200410456 - }, - { - "Latitude": 37.4391295264553, - "Longitude": 39.785100802645864 - }, - { - "Latitude": 37.510878013230325, - "Longitude": 39.29517709241584 - }, - { - "Latitude": 37.580690013230324, - "Longitude": 38.80405309241584 - }, - { - "Latitude": 37.52454535929715, - "Longitude": 38.79164966112796 - }, - { - "Latitude": 37.643205847988945, - "Longitude": 37.92590907183943 - }, - { - "Latitude": 36.277943152074116, - "Longitude": 37.64814575242416 - }, - { - "Latitude": 36.27735285568951, - "Longitude": 37.65041435955687 - }, - { - "Latitude": 36.111618275866036, - "Longitude": 37.61699395524997 - }, - { - "Latitude": 35.997073364974284, - "Longitude": 38.49576709571327 - }, - { - "Latitude": 36.056646468363866, - "Longitude": 38.50873923689982 - }, - { - "Latitude": 35.99456687090555, - "Longitude": 38.962529726360856 - }, - { - "Latitude": 35.92252341193061, - "Longitude": 39.473041057707775 - } - ] - } - } - ] - } - } - }, - "ProviderDates": [ - { - "Date": "2024-03-02T22:12:36.000Z", - "Type": "Insert" - }, - { - "Date": "2024-03-02T22:12:36.000Z", - "Type": "Update" - } - ], - "DataGranule": { - "ArchiveAndDistributionInformation": [ - { - "Name": "S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0.nc", - "SizeInBytes": 456 - } - ], - "DayNightFlag": "Unspecified", - "ProductionDateTime": "2024-03-02T15:10:21.482183Z" - }, - "Platforms": [ - { - "ShortName": "Sentinel-1A" - } - ], - "OrbitCalculatedSpatialDomains": [ - {"OrbitNumber": 52520}, - {"OrbitNumber": 51995} - ], - "InputGranules": ["S1A_IW_SLC__1SDV_20240212T032621_20240212T032649_052520_065A36_7976", - "S1A_IW_SLC__1SDV_20240212T032646_20240212T032714_052520_065A36_4F51", - "S1A_IW_SLC__1SDV_20240107T032622_20240107T032650_051995_06487A_6B83", - "S1A_IW_SLC__1SDV_20240107T032648_20240107T032715_051995_06487A_DBAE" - ], - "AdditionalAttributes": [ - {"Name": "ASCENDING_DESCENDING", "Values": ["descending"]}, - {"Name": "BEAM_MODE", "Values": ["IW"]}, - {"Name": "POLARIZATION", "Values": ["VV"]}, - {"Name": "PERPENDICULAR_BASELINE", "Values": ["56.0596"]}, - {"Name": "VERSION", "Values": ["3.0.0"]}, - {"Name": "FRAME_NUMBER", "Values": ["19116"]}, - {"Name": "PATH_NUMBER", "Values": ["123"]}, - {"Name": "TEMPORAL_BASELINE_DAYS", "Values": ["36"]} - ] -} From 92589925fba4a13c2d067c195f08504cfb73c3d9 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 22 Mar 2024 13:03:07 -0800 Subject: [PATCH 70/81] add second granule test case to tests/data/ --- .../src/metadata_construction.py | 2 +- tests/conftest.py | 6 - tests/data/{ => granule1}/config.json | 0 tests/data/{ => granule1}/granule.umm.json | 0 tests/data/{ => granule1}/inputs.json | 0 tests/data/{ => granule1}/sds_metadata.json | 0 tests/data/granule2/config.json | 7 + tests/data/granule2/granule.umm.json | 222 ++++++++++++++++++ tests/data/granule2/inputs.json | 14 ++ tests/data/granule2/sds_metadata.json | 153 ++++++++++++ tests/test_metadata_construction.py | 39 ++- tests/test_verify.py | 6 +- 12 files changed, 435 insertions(+), 14 deletions(-) rename tests/data/{ => granule1}/config.json (100%) rename tests/data/{ => granule1}/granule.umm.json (100%) rename tests/data/{ => granule1}/inputs.json (100%) rename tests/data/{ => granule1}/sds_metadata.json (100%) create mode 100644 tests/data/granule2/config.json create mode 100644 tests/data/granule2/granule.umm.json create mode 100644 tests/data/granule2/inputs.json create mode 100644 tests/data/granule2/sds_metadata.json diff --git a/metadata-construction/src/metadata_construction.py b/metadata-construction/src/metadata_construction.py index 6b62f8cf..ca729c19 100644 --- a/metadata-construction/src/metadata_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -122,7 +122,7 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: "ProductionDateTime": sds_metadata['creation_timestamp'] }, "Platforms": [ - {"ShortName": platform} for platform in set(sds_metadata['metadata']['platform']) + {"ShortName": platform} for platform in sorted(set(sds_metadata['metadata']['platform'])) ], "OrbitCalculatedSpatialDomains": [ {"OrbitNumber": orbit} for orbit in sds_metadata['metadata']['orbit_number'] diff --git a/tests/conftest.py b/tests/conftest.py index 29c32308..828229ce 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,12 +10,6 @@ def test_data_dir(): return data_dir -@pytest.fixture -def inputs(test_data_dir): - with open(f'{test_data_dir}/inputs.json') as f: - return json.load(f) - - @pytest.fixture def config(test_data_dir): with open(f'{test_data_dir}/config.json') as f: diff --git a/tests/data/config.json b/tests/data/granule1/config.json similarity index 100% rename from tests/data/config.json rename to tests/data/granule1/config.json diff --git a/tests/data/granule.umm.json b/tests/data/granule1/granule.umm.json similarity index 100% rename from tests/data/granule.umm.json rename to tests/data/granule1/granule.umm.json diff --git a/tests/data/inputs.json b/tests/data/granule1/inputs.json similarity index 100% rename from tests/data/inputs.json rename to tests/data/granule1/inputs.json diff --git a/tests/data/sds_metadata.json b/tests/data/granule1/sds_metadata.json similarity index 100% rename from tests/data/sds_metadata.json rename to tests/data/granule1/sds_metadata.json diff --git a/tests/data/granule2/config.json b/tests/data/granule2/config.json new file mode 100644 index 00000000..6d364398 --- /dev/null +++ b/tests/data/granule2/config.json @@ -0,0 +1,7 @@ +{ + "output_bucket": "output-bucket", + "granule_data": { + "download_path": "https://download-path.asf.alaska.edu", + "browse_path": "https://browse-path.asf.alaska.edu" + } +} diff --git a/tests/data/granule2/granule.umm.json b/tests/data/granule2/granule.umm.json new file mode 100644 index 00000000..259d6d2e --- /dev/null +++ b/tests/data/granule2/granule.umm.json @@ -0,0 +1,222 @@ +{ + "AdditionalAttributes": [ + { + "Name": "ASCENDING_DESCENDING", + "Values": [ + "ascending" + ] + }, + { + "Name": "BEAM_MODE", + "Values": [ + "IW" + ] + }, + { + "Name": "POLARIZATION", + "Values": [ + "VV" + ] + }, + { + "Name": "PERPENDICULAR_BASELINE", + "Values": [ + "57.4856" + ] + }, + { + "Name": "VERSION", + "Values": [ + "3.0.1" + ] + }, + { + "Name": "FRAME_NUMBER", + "Values": [ + "2747" + ] + }, + { + "Name": "PATH_NUMBER", + "Values": [ + "18" + ] + }, + { + "Name": "TEMPORAL_BASELINE_DAYS", + "Values": [ + "36" + ] + } + ], + "CollectionReference": { + "ShortName": "ARIA_S1_GUNW", + "Version": "1" + }, + "DataGranule": { + "ArchiveAndDistributionInformation": [ + { + "Name": "product/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.nc", + "SizeInBytes": 789 + } + ], + "DayNightFlag": "Unspecified", + "ProductionDateTime": "2024-03-22T08:06:38.607757Z" + }, + "GranuleUR": "S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1", + "InputGranules": [ + "S1A_IW_SLC__1SDV_20230329T232719_20230329T232746_047865_05C06B_C11E", + "S1A_IW_SLC__1SDV_20230329T232744_20230329T232812_047865_05C06B_9386", + "S1B_IW_SLC__1SDV_20230221T232719_20230221T232745_047340_05AEAE_8D7B", + "S1B_IW_SLC__1SDV_20230221T232743_20230221T232811_047340_05AEAE_981D" + ], + "MetadataSpecification": { + "Name": "UMM-G", + "URL": "https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5", + "Version": "1.6.5" + }, + "OrbitCalculatedSpatialDomains": [ + { + "OrbitNumber": 47865 + }, + { + "OrbitNumber": 47340 + } + ], + "Platforms": [ + { + "ShortName": "Sentinel-1A" + }, + { + "ShortName": "Sentinel-1B" + } + ], + "ProviderDates": [ + { + "Date": "2024-03-22T10:08:43.000Z", + "Type": "Insert" + }, + { + "Date": "2024-03-22T10:08:43.000Z", + "Type": "Update" + } + ], + "RelatedUrls": [ + { + "Type": "GET DATA", + "URL": "https://download-path.asf.alaska.edu/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.nc" + }, + { + "Type": "GET RELATED VISUALIZATION", + "URL": "https://browse-path.asf.alaska.edu/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.png" + } + ], + "SpatialExtent": { + "HorizontalSpatialDomain": { + "Geometry": { + "GPolygons": [ + { + "Boundary": { + "Points": [ + { + "Latitude": -37.43845557709951, + "Longitude": -71.088154343761 + }, + { + "Latitude": -37.63130067836205, + "Longitude": -71.0206855689116 + }, + { + "Latitude": -37.42417895379595, + "Longitude": -70.10626591506461 + }, + { + "Latitude": -37.68484259237643, + "Longitude": -70.01098485276503 + }, + { + "Latitude": -37.56568446679363, + "Longitude": -69.5019096895951 + }, + { + "Latitude": -37.459393330218404, + "Longitude": -69.0566394230276 + }, + { + "Latitude": -37.56703501124253, + "Longitude": -69.01547889360272 + }, + { + "Latitude": -37.35564963855437, + "Longitude": -68.1507159694866 + }, + { + "Latitude": -36.68760628849636, + "Longitude": -68.41109313506928 + }, + { + "Latitude": -36.019089312074684, + "Longitude": -68.66685734409843 + }, + { + "Latitude": -36.020073879356936, + "Longitude": -68.6716811133144 + }, + { + "Latitude": -35.857617424181015, + "Longitude": -68.73316196920756 + }, + { + "Latitude": -36.0649728442111, + "Longitude": -69.54802532449655 + }, + { + "Latitude": -35.79751453349513, + "Longitude": -69.64590714657756 + }, + { + "Latitude": -35.91297819237887, + "Longitude": -70.11270706640265 + }, + { + "Latitude": -36.02551493608475, + "Longitude": -70.57702608897159 + }, + { + "Latitude": -35.90917281361428, + "Longitude": -70.61807585428566 + }, + { + "Latitude": -36.015520679295875, + "Longitude": -71.06311893454271 + }, + { + "Latitude": -36.12858809256168, + "Longitude": -71.54597172064202 + }, + { + "Latitude": -36.649663452218704, + "Longitude": -71.369602980597 + }, + { + "Latitude": -36.647882653620094, + "Longitude": -71.36054301106373 + }, + { + "Latitude": -37.43845557709951, + "Longitude": -71.088154343761 + } + ] + } + } + ] + } + } + }, + "TemporalExtent": { + "RangeDateTime": { + "BeginningDateTime": "2023-03-29T23:27:19.000000Z", + "EndingDateTime": "2023-03-29T23:28:12.000000Z" + } + } +} \ No newline at end of file diff --git a/tests/data/granule2/inputs.json b/tests/data/granule2/inputs.json new file mode 100644 index 00000000..ed828c0e --- /dev/null +++ b/tests/data/granule2/inputs.json @@ -0,0 +1,14 @@ +{ + "Browse": { + "Bucket": "browse-bucket", + "Key": "browse/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.png" + }, + "Metadata": { + "Bucket": "metadata-bucket", + "Key": "metadata/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.json" + }, + "Product": { + "Bucket": "product-bucket", + "Key": "product/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.nc" + } +} \ No newline at end of file diff --git a/tests/data/granule2/sds_metadata.json b/tests/data/granule2/sds_metadata.json new file mode 100644 index 00000000..8c14bb96 --- /dev/null +++ b/tests/data/granule2/sds_metadata.json @@ -0,0 +1,153 @@ +{ + "label": "S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1", + "location": { + "type": "Polygon", + "coordinates": [ + [ + [ + -71.088154343761, + -37.43845557709951 + ], + [ + -71.36054301106373, + -36.647882653620094 + ], + [ + -71.369602980597, + -36.649663452218704 + ], + [ + -71.54597172064202, + -36.12858809256168 + ], + [ + -71.06311893454271, + -36.015520679295875 + ], + [ + -70.61807585428566, + -35.90917281361428 + ], + [ + -70.57702608897159, + -36.02551493608475 + ], + [ + -70.11270706640265, + -35.91297819237887 + ], + [ + -69.64590714657756, + -35.79751453349513 + ], + [ + -69.54802532449655, + -36.0649728442111 + ], + [ + -68.73316196920756, + -35.857617424181015 + ], + [ + -68.6716811133144, + -36.020073879356936 + ], + [ + -68.66685734409843, + -36.019089312074684 + ], + [ + -68.41109313506928, + -36.68760628849636 + ], + [ + -68.1507159694866, + -37.35564963855437 + ], + [ + -69.01547889360272, + -37.56703501124253 + ], + [ + -69.0566394230276, + -37.459393330218404 + ], + [ + -69.5019096895951, + -37.56568446679363 + ], + [ + -70.01098485276503, + -37.68484259237643 + ], + [ + -70.10626591506461, + -37.42417895379595 + ], + [ + -71.0206855689116, + -37.63130067836205 + ], + [ + -71.088154343761, + -37.43845557709951 + ] + ] + ] + }, + "creation_timestamp": "2024-03-22T08:06:38.607757Z", + "version": "3.0.1", + "metadata": { + "ogr_bbox": [ + [ + -71.54597172064202, + -37.68484259237643 + ], + [ + -68.1507159694866, + -37.68484259237643 + ], + [ + -68.1507159694866, + -35.79751453349513 + ], + [ + -71.54597172064202, + -35.79751453349513 + ] + ], + "reference_scenes": [ + "S1A_IW_SLC__1SDV_20230329T232719_20230329T232746_047865_05C06B_C11E", + "S1A_IW_SLC__1SDV_20230329T232744_20230329T232812_047865_05C06B_9386" + ], + "secondary_scenes": [ + "S1B_IW_SLC__1SDV_20230221T232719_20230221T232745_047340_05AEAE_8D7B", + "S1B_IW_SLC__1SDV_20230221T232743_20230221T232811_047340_05AEAE_981D" + ], + "sensing_start": "2023-03-29T23:27:19.000000Z", + "sensing_stop": "2023-03-29T23:28:12.000000Z", + "version": "3.0.1", + "temporal_baseline_days": 36, + "orbit_number": [ + 47865, + 47340 + ], + "platform": [ + "Sentinel-1A", + "Sentinel-1B" + ], + "beam_mode": "IW", + "orbit_direction": "ascending", + "dataset_type": "slc", + "product_type": "interferogram", + "polarization": "VV", + "look_direction": "right", + "track_number": 18, + "perpendicular_baseline": 57.4856, + "frame_number": 2747, + "weather_model": [ + "HRES", + "HRRR" + ] + } +} \ No newline at end of file diff --git a/tests/test_metadata_construction.py b/tests/test_metadata_construction.py index f858901a..cbcecea0 100644 --- a/tests/test_metadata_construction.py +++ b/tests/test_metadata_construction.py @@ -46,7 +46,7 @@ def test_get_sds_metadata(test_data_dir, s3_stubber): 'Key': 'S1-GUNW-D-R-123-tops-20240212_20240107-032647-00038E_00036N-PP-2e78-v3_0_0' } - sds_metadata_file = test_data_dir / 'sds_metadata.json' + sds_metadata_file = test_data_dir / 'granule1' / 'sds_metadata.json' sds_metadata = json.loads(sds_metadata_file.read_text()) with sds_metadata_file.open() as f: @@ -54,13 +54,15 @@ def test_get_sds_metadata(test_data_dir, s3_stubber): assert metadata_construction.get_sds_metadata(obj) == sds_metadata -def test_create_granule_metadata_in_s3(test_data_dir, inputs, config, mocker): - mocker.patch('metadata_construction.now', return_value='2024-03-02T22:12:36.000Z') - mocker.patch('metadata_construction.upload_content_to_s3') +def test_create_granule_metadata_in_s3_g1(test_data_dir, mocker): + sds_metadata =json.loads((test_data_dir / 'granule1'/ 'sds_metadata.json').read_text()) + inputs = json.loads((test_data_dir / 'granule1' / 'inputs.json').read_text()) + config = json.loads((test_data_dir / 'granule1' / 'config.json').read_text()) - sds_metadata =json.loads((test_data_dir / 'sds_metadata.json').read_text()) mocker.patch('metadata_construction.get_sds_metadata', return_value=sds_metadata) + mocker.patch('metadata_construction.now', return_value='2024-03-02T22:12:36.000Z') mocker.patch('metadata_construction.get_s3_file_size', return_value=456) + mocker.patch('metadata_construction.upload_content_to_s3') metadata_s3_object = { 'bucket': 'ingest-test-aux', @@ -72,6 +74,31 @@ def test_create_granule_metadata_in_s3(test_data_dir, inputs, config, mocker): assert metadata_construction.upload_content_to_s3.mock_calls == [ unittest.mock.call( metadata_s3_object, - json.dumps(json.loads((test_data_dir / 'granule.umm.json').read_text()), sort_keys=True), + json.dumps(json.loads((test_data_dir / 'granule1' / 'granule.umm.json').read_text()), sort_keys=True), + ), + ] + + +def test_create_granule_metadata_in_s3_g2(test_data_dir, mocker): + sds_metadata =json.loads((test_data_dir / 'granule2'/ 'sds_metadata.json').read_text()) + inputs = json.loads((test_data_dir / 'granule2' / 'inputs.json').read_text()) + config = json.loads((test_data_dir / 'granule2' / 'config.json').read_text()) + + mocker.patch('metadata_construction.get_sds_metadata', return_value=sds_metadata) + mocker.patch('metadata_construction.now', return_value='2024-03-22T10:08:43.000Z') + mocker.patch('metadata_construction.get_s3_file_size', return_value=789) + mocker.patch('metadata_construction.upload_content_to_s3') + + metadata_s3_object = { + 'bucket': 'output-bucket', + 'key': 'S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.umm.json', + } + + assert metadata_construction.create_granule_metadata_in_s3(inputs, config) == metadata_s3_object + + assert metadata_construction.upload_content_to_s3.mock_calls == [ + unittest.mock.call( + metadata_s3_object, + json.dumps(json.loads((test_data_dir / 'granule2' / 'granule.umm.json').read_text()), sort_keys=True), ), ] diff --git a/tests/test_verify.py b/tests/test_verify.py index e8632d6f..6d449a2c 100644 --- a/tests/test_verify.py +++ b/tests/test_verify.py @@ -33,6 +33,10 @@ def test_validate_metadata(test_data_dir, mocker, monkeypatch): with pytest.raises(verify.INVALID_METADATA, match=r"^'label' is a required property$"): verify.validate_metadata({'Bucket': None, 'Key': None}) - sds_metadata_file = test_data_dir / 'sds_metadata.json' + sds_metadata_file = test_data_dir / 'granule1' / 'sds_metadata.json' + mocker.patch('verify.get_file_content_from_s3', return_value=sds_metadata_file.read_text()) + assert verify.validate_metadata({'Bucket': None, 'Key': None}) is None + + sds_metadata_file = test_data_dir / 'granule2' / 'sds_metadata.json' mocker.patch('verify.get_file_content_from_s3', return_value=sds_metadata_file.read_text()) assert verify.validate_metadata({'Bucket': None, 'Key': None}) is None From 6cfc876cf853991d4799abb07eeceaee3192fdb6 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 22 Mar 2024 13:05:15 -0800 Subject: [PATCH 71/81] add trailing newlines --- tests/data/granule2/granule.umm.json | 2 +- tests/data/granule2/inputs.json | 2 +- tests/data/granule2/sds_metadata.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/data/granule2/granule.umm.json b/tests/data/granule2/granule.umm.json index 259d6d2e..c42a4d7b 100644 --- a/tests/data/granule2/granule.umm.json +++ b/tests/data/granule2/granule.umm.json @@ -219,4 +219,4 @@ "EndingDateTime": "2023-03-29T23:28:12.000000Z" } } -} \ No newline at end of file +} diff --git a/tests/data/granule2/inputs.json b/tests/data/granule2/inputs.json index ed828c0e..4ffb7a66 100644 --- a/tests/data/granule2/inputs.json +++ b/tests/data/granule2/inputs.json @@ -11,4 +11,4 @@ "Bucket": "product-bucket", "Key": "product/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.nc" } -} \ No newline at end of file +} diff --git a/tests/data/granule2/sds_metadata.json b/tests/data/granule2/sds_metadata.json index 8c14bb96..11c1f32b 100644 --- a/tests/data/granule2/sds_metadata.json +++ b/tests/data/granule2/sds_metadata.json @@ -150,4 +150,4 @@ "HRRR" ] } -} \ No newline at end of file +} From 9b99f2884824f21b64ffb662ea670338f1be0294 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 22 Mar 2024 13:11:13 -0800 Subject: [PATCH 72/81] add failing test for weather model attribute --- tests/data/granule2/granule.umm.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/data/granule2/granule.umm.json b/tests/data/granule2/granule.umm.json index c42a4d7b..9af78b3e 100644 --- a/tests/data/granule2/granule.umm.json +++ b/tests/data/granule2/granule.umm.json @@ -47,6 +47,13 @@ "Values": [ "36" ] + }, + { + "Name": "WEATHER_MODEL", + "Values": [ + "HRRR", + "HRES" + ] } ], "CollectionReference": { From c7f4f1b27569acce696ab4b9e07611ef46d085de Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 22 Mar 2024 13:32:44 -0800 Subject: [PATCH 73/81] update metadata-construction to handle s3 keys that include folder prefixes --- metadata-construction/src/metadata_construction.py | 10 +++++----- tests/data/granule2/granule.umm.json | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/metadata-construction/src/metadata_construction.py b/metadata-construction/src/metadata_construction.py index ca729c19..ec11703e 100644 --- a/metadata-construction/src/metadata_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -55,7 +55,7 @@ def format_polygon(polygon): return coordinates -def render_granule_metadata(sds_metadata, config, product) -> dict: +def render_granule_metadata(sds_metadata, config, product, browse) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'] browse_url = config['granule_data']['browse_path'] @@ -74,11 +74,11 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: }, 'RelatedUrls': [ { - 'URL': f'{download_url}/{granule_ur}.nc', + 'URL': f'{download_url}/{product["Key"]}', 'Type': 'GET DATA', }, { - 'URL': f'{browse_url}/{granule_ur}.png', + 'URL': f'{browse_url}/{browse["Key"]}', 'Type': 'GET RELATED VISUALIZATION', }, ], @@ -114,7 +114,7 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: "DataGranule": { "ArchiveAndDistributionInformation": [ { - "Name": product['Key'], + "Name": os.path.basename(product['Key']), "SizeInBytes": get_s3_file_size(product) } ], @@ -144,7 +144,7 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: def create_granule_metadata_in_s3(inputs, config): log.info('Creating metadata file for %s', inputs['Product']['Key']) sds_metadata = get_sds_metadata(inputs['Metadata']) - umm_json = render_granule_metadata(sds_metadata, config, inputs['Product']) + umm_json = render_granule_metadata(sds_metadata, config, inputs['Product'], inputs['Browse']) output_location = { 'bucket': config['output_bucket'], 'key': umm_json['GranuleUR'] + '.umm.json', diff --git a/tests/data/granule2/granule.umm.json b/tests/data/granule2/granule.umm.json index c42a4d7b..2d7768da 100644 --- a/tests/data/granule2/granule.umm.json +++ b/tests/data/granule2/granule.umm.json @@ -56,7 +56,7 @@ "DataGranule": { "ArchiveAndDistributionInformation": [ { - "Name": "product/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.nc", + "Name": "S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.nc", "SizeInBytes": 789 } ], @@ -104,11 +104,11 @@ "RelatedUrls": [ { "Type": "GET DATA", - "URL": "https://download-path.asf.alaska.edu/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.nc" + "URL": "https://download-path.asf.alaska.edu/product/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.nc" }, { "Type": "GET RELATED VISUALIZATION", - "URL": "https://browse-path.asf.alaska.edu/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.png" + "URL": "https://browse-path.asf.alaska.edu/browse/S1-GUNW-A-R-018-tops-20230329_20230221-232745-00072W_00038S-PP-1cfc-v3_0_1.png" } ], "SpatialExtent": { From 249d5050a73e0a9ed5b38bebacf98726bd34a908 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 22 Mar 2024 14:05:37 -0800 Subject: [PATCH 74/81] add in weather model --- metadata-construction/src/metadata_construction.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/metadata-construction/src/metadata_construction.py b/metadata-construction/src/metadata_construction.py index ca729c19..4f0e8ddf 100644 --- a/metadata-construction/src/metadata_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -55,6 +55,11 @@ def format_polygon(polygon): return coordinates +def add_weather_model(sds_metadata): + if sds_metadata['metadata'].get('weather_model'): + return {"Name": "WEATHER_MODEL", "Values": sds_metadata['metadata']['weather_model']} + + def render_granule_metadata(sds_metadata, config, product) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'] @@ -136,7 +141,8 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: {"Name": "VERSION", "Values": [sds_metadata['metadata']['version']]}, {"Name": "FRAME_NUMBER", "Values": [str(sds_metadata['metadata']['frame_number'])]}, {"Name": "PATH_NUMBER", "Values": [str(sds_metadata['metadata']['track_number'])]}, - {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [str(sds_metadata['metadata']['temporal_baseline_days'])]} + {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [str(sds_metadata['metadata']['temporal_baseline_days'])]}, + {"Name": "WEATHER_MODEL", "Values": sds_metadata['metadata'].get('weather_model')} ] } From 3d0680be97118ae1b93304f226f31fdc7d334dac Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 22 Mar 2024 14:06:05 -0800 Subject: [PATCH 75/81] switch HRES HRRR order --- tests/data/granule2/sds_metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/data/granule2/sds_metadata.json b/tests/data/granule2/sds_metadata.json index 11c1f32b..b5583315 100644 --- a/tests/data/granule2/sds_metadata.json +++ b/tests/data/granule2/sds_metadata.json @@ -146,8 +146,8 @@ "perpendicular_baseline": 57.4856, "frame_number": 2747, "weather_model": [ - "HRES", - "HRRR" + "HRRR", + "HRES" ] } } From f9a11cb6f34a708c1df9fc3cb5ea7a75449577a7 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 22 Mar 2024 14:11:31 -0800 Subject: [PATCH 76/81] append weathermodel to umm --- metadata-construction/src/metadata_construction.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/metadata-construction/src/metadata_construction.py b/metadata-construction/src/metadata_construction.py index 4f0e8ddf..84b879c1 100644 --- a/metadata-construction/src/metadata_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -66,7 +66,7 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: browse_url = config['granule_data']['browse_path'] polygon = format_polygon(sds_metadata['location']['coordinates'][0]) - return { + umm = { 'MetadataSpecification': { 'URL': 'https://cdn.earthdata.nasa.gov/umm/granule/v1.6.5', 'Name': 'UMM-G', @@ -141,11 +141,16 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: {"Name": "VERSION", "Values": [sds_metadata['metadata']['version']]}, {"Name": "FRAME_NUMBER", "Values": [str(sds_metadata['metadata']['frame_number'])]}, {"Name": "PATH_NUMBER", "Values": [str(sds_metadata['metadata']['track_number'])]}, - {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [str(sds_metadata['metadata']['temporal_baseline_days'])]}, - {"Name": "WEATHER_MODEL", "Values": sds_metadata['metadata'].get('weather_model')} + {"Name": "TEMPORAL_BASELINE_DAYS", "Values": [str(sds_metadata['metadata']['temporal_baseline_days'])]} ] } + if sds_metadata['metadata'].get('weather_model'): + umm['AdditionalAttributes'].append({"Name": "WEATHER_MODEL", + "Values": sds_metadata['metadata'].get('weather_model')}) + + return umm + def create_granule_metadata_in_s3(inputs, config): log.info('Creating metadata file for %s', inputs['Product']['Key']) From 964c95661da051e3f8c35eeaa05bc10489752752 Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 22 Mar 2024 14:16:15 -0800 Subject: [PATCH 77/81] remove old function --- metadata-construction/src/metadata_construction.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/metadata-construction/src/metadata_construction.py b/metadata-construction/src/metadata_construction.py index 84b879c1..1ffb2afc 100644 --- a/metadata-construction/src/metadata_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -55,11 +55,6 @@ def format_polygon(polygon): return coordinates -def add_weather_model(sds_metadata): - if sds_metadata['metadata'].get('weather_model'): - return {"Name": "WEATHER_MODEL", "Values": sds_metadata['metadata']['weather_model']} - - def render_granule_metadata(sds_metadata, config, product) -> dict: granule_ur = sds_metadata['label'] download_url = config['granule_data']['download_path'] From 59a4af96f84783ee8482c0a2e80922101c98420d Mon Sep 17 00:00:00 2001 From: jacquelynsmale Date: Fri, 22 Mar 2024 14:17:37 -0800 Subject: [PATCH 78/81] clean up weathermodel --- metadata-construction/src/metadata_construction.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/metadata-construction/src/metadata_construction.py b/metadata-construction/src/metadata_construction.py index 1ffb2afc..6821a757 100644 --- a/metadata-construction/src/metadata_construction.py +++ b/metadata-construction/src/metadata_construction.py @@ -140,9 +140,9 @@ def render_granule_metadata(sds_metadata, config, product) -> dict: ] } - if sds_metadata['metadata'].get('weather_model'): + if 'weather_model' in sds_metadata['metadata']: umm['AdditionalAttributes'].append({"Name": "WEATHER_MODEL", - "Values": sds_metadata['metadata'].get('weather_model')}) + "Values": sds_metadata['metadata']['weather_model']}) return umm From 8a216940b50ac5d711be8359dead2c872b4b0429 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 25 Mar 2024 11:03:00 -0800 Subject: [PATCH 79/81] final cleanup before merging to test --- .github/workflows/deploy.yml | 10 ---------- CHANGELOG.md | 12 ++++++++++-- Makefile | 2 +- tests/data/granule1/config.json | 10 +++++----- tests/data/granule1/sds_metadata.json | 2 +- tests/data/granule2/config.json | 10 +++++----- 6 files changed, 22 insertions(+), 24 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index eff63528..d2e98012 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -5,7 +5,6 @@ on: branches: - prod - test - - dev jobs: deploy: @@ -31,15 +30,6 @@ jobs: cmr_provider: ASF deploy_ref: refs/heads/test - - environment: ingest-dev - private_bucket: grfn-content-dev - public_bucket: grfn-public-dev - distribution_base_url: https://grfn-test.asf.alaska.edu/door/download - browse_base_url: https://grfn-public-test.asf.alaska.edu - cmr_base_url: https://cmr.uat.earthdata.nasa.gov - cmr_provider: ASF - deploy_ref: refs/heads/dev - environment: name: ${{ matrix.environment }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 819c8d9b..dee58c7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [PEP 440](https://www.python.org/dev/peps/pep-0440/) and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.2.2] +## [2.0.0] +This release supports publishing v3 GUNW products to production CMR. CMR metadata has been significantly revised to reflect the current state of these products, align with other recently developed ASF CMR collections, and better support ASF search tooling. + ### Changed -- `echo10_construction.py` is updated to support the latest version of GUNW products. +- Granules are now published to the `ARIA_S1_GUNW` collection in CMR instead of the `SENTINEL-1_INTERFEROGRAMS` collection. +- Granules are now published using the UMM-G json metadata format instead of the ECHO 10 xml format. +- Granule metadata content has been significantly revised. +- `perpendicular_baseline`, `temporal_baseline_days`, and `frame_number` are now required fields in the SDS metadata file instead of being optional. +### Removed +- Ingest of v2 GUNW products is no longer supported. +- Virtual geotiff products are no longer published to CMR. ## [1.2.1] ### Changed diff --git a/Makefile b/Makefile index 0e92b408..1a0102cc 100644 --- a/Makefile +++ b/Makefile @@ -5,4 +5,4 @@ export CONFIG = "{}" test_file ?= tests/ pytest: - pytest -vv $(test_file) + pytest $(test_file) diff --git a/tests/data/granule1/config.json b/tests/data/granule1/config.json index bcdf5ba8..1f3c7344 100644 --- a/tests/data/granule1/config.json +++ b/tests/data/granule1/config.json @@ -1,7 +1,7 @@ { - "output_bucket": "ingest-test-aux", - "granule_data": { - "download_path": "https://grfn-test.asf.alaska.edu/door/download", - "browse_path": "https://grfn-public-test.asf.alaska.edu" - } + "output_bucket": "ingest-test-aux", + "granule_data": { + "download_path": "https://grfn-test.asf.alaska.edu/door/download", + "browse_path": "https://grfn-public-test.asf.alaska.edu" + } } diff --git a/tests/data/granule1/sds_metadata.json b/tests/data/granule1/sds_metadata.json index 125b2326..b928f6bf 100644 --- a/tests/data/granule1/sds_metadata.json +++ b/tests/data/granule1/sds_metadata.json @@ -121,4 +121,4 @@ "perpendicular_baseline": 56.0596, "frame_number": 19116 } -} \ No newline at end of file +} diff --git a/tests/data/granule2/config.json b/tests/data/granule2/config.json index 6d364398..8300cf02 100644 --- a/tests/data/granule2/config.json +++ b/tests/data/granule2/config.json @@ -1,7 +1,7 @@ { - "output_bucket": "output-bucket", - "granule_data": { - "download_path": "https://download-path.asf.alaska.edu", - "browse_path": "https://browse-path.asf.alaska.edu" - } + "output_bucket": "output-bucket", + "granule_data": { + "download_path": "https://download-path.asf.alaska.edu", + "browse_path": "https://browse-path.asf.alaska.edu" + } } From 36f8eef0b861dfb90c201955f23819582ba00058 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Mon, 25 Mar 2024 11:07:51 -0800 Subject: [PATCH 80/81] remove extra newline --- requirements-metadata-construction.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements-metadata-construction.txt b/requirements-metadata-construction.txt index 45fd6678..90d36cd4 100644 --- a/requirements-metadata-construction.txt +++ b/requirements-metadata-construction.txt @@ -1,2 +1 @@ boto3==1.34.68 - From db24c390a3f9e7508b41b5adb891a1e389d68a97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 21:05:59 +0000 Subject: [PATCH 81/81] Bump boto3 from 1.34.68 to 1.34.70 Bumps [boto3](https://github.com/boto/boto3) from 1.34.68 to 1.34.70. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.34.68...1.34.70) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-cmr-token.txt | 2 +- requirements-ingest.txt | 2 +- requirements-invoke.txt | 2 +- requirements-metadata-construction.txt | 2 +- requirements-metadata-to-cmr.txt | 2 +- requirements-notify.txt | 2 +- requirements-verify.txt | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements-cmr-token.txt b/requirements-cmr-token.txt index 4658f1c9..83661eac 100644 --- a/requirements-cmr-token.txt +++ b/requirements-cmr-token.txt @@ -1,2 +1,2 @@ -boto3==1.34.68 +boto3==1.34.70 requests-pkcs12==1.24 diff --git a/requirements-ingest.txt b/requirements-ingest.txt index 90d36cd4..b9e43ed5 100644 --- a/requirements-ingest.txt +++ b/requirements-ingest.txt @@ -1 +1 @@ -boto3==1.34.68 +boto3==1.34.70 diff --git a/requirements-invoke.txt b/requirements-invoke.txt index 90d36cd4..b9e43ed5 100644 --- a/requirements-invoke.txt +++ b/requirements-invoke.txt @@ -1 +1 @@ -boto3==1.34.68 +boto3==1.34.70 diff --git a/requirements-metadata-construction.txt b/requirements-metadata-construction.txt index 90d36cd4..b9e43ed5 100644 --- a/requirements-metadata-construction.txt +++ b/requirements-metadata-construction.txt @@ -1 +1 @@ -boto3==1.34.68 +boto3==1.34.70 diff --git a/requirements-metadata-to-cmr.txt b/requirements-metadata-to-cmr.txt index af2fd8d9..0dacd1e8 100644 --- a/requirements-metadata-to-cmr.txt +++ b/requirements-metadata-to-cmr.txt @@ -1,2 +1,2 @@ -boto3==1.34.68 +boto3==1.34.70 requests==2.31.0 diff --git a/requirements-notify.txt b/requirements-notify.txt index 90d36cd4..b9e43ed5 100644 --- a/requirements-notify.txt +++ b/requirements-notify.txt @@ -1 +1 @@ -boto3==1.34.68 +boto3==1.34.70 diff --git a/requirements-verify.txt b/requirements-verify.txt index 1fd894ff..c8f7a657 100644 --- a/requirements-verify.txt +++ b/requirements-verify.txt @@ -1,2 +1,2 @@ -boto3==1.34.68 +boto3==1.34.70 jsonschema==4.21.1

7_BPD!r8cBzwW-u-0ec9Mg^qkEam&z|NC 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 z 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