diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml
index 7978f8aaa01..153b0ea2fef 100644
--- a/.github/workflows/bootstrap_region.yml
+++ b/.github/workflows/bootstrap_region.yml
@@ -96,7 +96,7 @@ jobs:
mask-aws-account-id: true
- id: go-setup
name: Setup Go
- uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0
+ uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0
- id: go-env
name: Go Env
run: go env
diff --git a/.github/workflows/layer_govcloud.yml b/.github/workflows/layer_govcloud.yml
index 21332a3a7ff..44229174c33 100644
--- a/.github/workflows/layer_govcloud.yml
+++ b/.github/workflows/layer_govcloud.yml
@@ -69,14 +69,14 @@ jobs:
aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-${{ matrix.arch }}:${{ inputs.version }} --query 'Content.Location' | xargs curl -L -o ${{ matrix.layer }}_${{ matrix.arch }}.zip
aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-${{ matrix.arch }}:${{ inputs.version }} > ${{ matrix.layer }}_${{ matrix.arch }}.json
- name: Store Zip
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.zip
path: ${{ matrix.layer }}_${{ matrix.arch }}.zip
retention-days: 1
if-no-files-found: error
- name: Store Metadata
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.json
path: ${{ matrix.layer }}_${{ matrix.arch }}.json
@@ -104,11 +104,11 @@ jobs:
environment: GovCloud ${{ inputs.environment }} (East)
steps:
- name: Download Zip
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.zip
- name: Download Metadata
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.json
- name: Verify Layer Signature
@@ -173,11 +173,11 @@ jobs:
name: GovCloud ${{ inputs.environment }} (West)
steps:
- name: Download Zip
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.zip
- name: Download Metadata
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.json
- name: Verify Layer Signature
diff --git a/.github/workflows/layer_govcloud_python313.yml b/.github/workflows/layer_govcloud_python313.yml
index 8de0c4498ee..f759436ba1f 100644
--- a/.github/workflows/layer_govcloud_python313.yml
+++ b/.github/workflows/layer_govcloud_python313.yml
@@ -65,14 +65,14 @@ jobs:
aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-${{ matrix.arch }}:${{ inputs.version }} --query 'Content.Location' | xargs curl -L -o ${{ matrix.layer }}_${{ matrix.arch }}.zip
aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-${{ matrix.arch }}:${{ inputs.version }} > ${{ matrix.layer }}_${{ matrix.arch }}.json
- name: Store Zip
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.zip
path: ${{ matrix.layer }}_${{ matrix.arch }}.zip
retention-days: 1
if-no-files-found: error
- name: Store Metadata
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.json
path: ${{ matrix.layer }}_${{ matrix.arch }}.json
@@ -96,11 +96,11 @@ jobs:
environment: GovCloud ${{ inputs.environment }} (East)
steps:
- name: Download Zip
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.zip
- name: Download Metadata
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.json
- name: Verify Layer Signature
@@ -161,11 +161,11 @@ jobs:
name: GovCloud ${{ inputs.environment }} (West)
steps:
- name: Download Zip
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.zip
- name: Download Metadata
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ matrix.layer }}_${{ matrix.arch }}.json
- name: Verify Layer Signature
diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml
index 7dbbb540a29..f8fcd18b0b2 100644
--- a/.github/workflows/ossf_scorecard.yml
+++ b/.github/workflows/ossf_scorecard.yml
@@ -35,7 +35,7 @@ jobs:
repo_token: ${{ secrets.SCORECARD_TOKEN }} # read-only fine-grained token to read branch protection settings
- name: "Upload results"
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: SARIF file
path: results.sarif
diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml
index 14fc05618b2..3ecb7bc1137 100644
--- a/.github/workflows/pre-release.yml
+++ b/.github/workflows/pre-release.yml
@@ -255,7 +255,7 @@ jobs:
artifact_name: ${{ needs.seal.outputs.artifact_name }}
- name: Download provenance
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{needs.provenance.outputs.provenance-name}}
diff --git a/.github/workflows/publish_v2_layer.yml b/.github/workflows/publish_v2_layer.yml
index 87a35c4c8f8..03864c28fea 100644
--- a/.github/workflows/publish_v2_layer.yml
+++ b/.github/workflows/publish_v2_layer.yml
@@ -101,7 +101,7 @@ jobs:
- name: Install poetry
run: pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1
- name: Setup Node.js
- uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
with:
node-version: "16.12"
- name: Setup python
@@ -146,7 +146,7 @@ jobs:
- name: zip output
run: zip -r cdk.out.zip cdk.out
- name: Archive CDK artifacts
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: cdk-layer-artefact
path: layer/cdk.out.zip
@@ -258,7 +258,7 @@ jobs:
artifact_name: ${{ inputs.source_code_artifact_name }}
- name: Download CDK layer artifacts
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
path: cdk-layer-stack
pattern: cdk-layer-stack-* # merge all Layer artifacts created per region earlier (reusable_deploy_v2_layer_stack.yml; step "Save Layer ARN artifact")
diff --git a/.github/workflows/publish_v3_layer.yml b/.github/workflows/publish_v3_layer.yml
index 230a4bab726..8c31cfba120 100644
--- a/.github/workflows/publish_v3_layer.yml
+++ b/.github/workflows/publish_v3_layer.yml
@@ -123,7 +123,7 @@ jobs:
pipx install git+https://github.com/python-poetry/poetry@bd500dd3bdfaec3de6894144c9cedb3a9358be84 # v2.0.1
pipx inject poetry git+https://github.com/python-poetry/poetry-plugin-export@8c83d26603ca94f2e203bfded7b6d7f530960e06 # v1.8.0
- name: Setup Node.js
- uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
with:
node-version: "18.20.4"
- name: Setup python
@@ -168,7 +168,7 @@ jobs:
- name: zip output
run: zip -r cdk.py${{ matrix.python-version }}.out.zip cdk.out
- name: Archive CDK artifacts
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: cdk-layer-artifact-py${{ matrix.python-version }}
path: layer_v3/cdk.py${{ matrix.python-version }}.out.zip
diff --git a/.github/workflows/record_pr.yml b/.github/workflows/record_pr.yml
index 6543d51c7c6..c43b4a403c2 100644
--- a/.github/workflows/record_pr.yml
+++ b/.github/workflows/record_pr.yml
@@ -53,7 +53,7 @@ jobs:
script: |
const script = require('.github/scripts/save_pr_details.js')
await script({github, context, core})
- - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: pr
path: pr.txt
diff --git a/.github/workflows/reusable_deploy_v2_layer_stack.yml b/.github/workflows/reusable_deploy_v2_layer_stack.yml
index 4a599c8f3c7..788cd65f20d 100644
--- a/.github/workflows/reusable_deploy_v2_layer_stack.yml
+++ b/.github/workflows/reusable_deploy_v2_layer_stack.yml
@@ -159,7 +159,7 @@ jobs:
role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }}
mask-aws-account-id: true
- name: Setup Node.js
- uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
with:
node-version: "16.12"
- name: Setup python
@@ -181,7 +181,7 @@ jobs:
- name: install deps
run: poetry install
- name: Download artifact
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ inputs.artefact-name }}
path: layer
@@ -198,7 +198,7 @@ jobs:
cat cdk-layer-stack/${{ matrix.region }}-layer-version.txt
- name: Save Layer ARN artifact
if: ${{ inputs.stage == 'PROD' }}
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: cdk-layer-stack-${{ matrix.region }}
path: ./layer/cdk-layer-stack/* # NOTE: upload-artifact does not inherit working-directory setting.
diff --git a/.github/workflows/reusable_deploy_v2_sar.yml b/.github/workflows/reusable_deploy_v2_sar.yml
index 2004f851b3b..44dd76460bf 100644
--- a/.github/workflows/reusable_deploy_v2_sar.yml
+++ b/.github/workflows/reusable_deploy_v2_sar.yml
@@ -113,11 +113,11 @@ jobs:
mask-aws-account-id: true
- name: Setup Node.js
- uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
with:
node-version: ${{ env.NODE_VERSION }}
- name: Download artifact
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: ${{ inputs.artefact-name }}
- name: Unzip artefact
diff --git a/.github/workflows/reusable_deploy_v3_layer_stack.yml b/.github/workflows/reusable_deploy_v3_layer_stack.yml
index 031d4455457..aabfab619eb 100644
--- a/.github/workflows/reusable_deploy_v3_layer_stack.yml
+++ b/.github/workflows/reusable_deploy_v3_layer_stack.yml
@@ -167,7 +167,7 @@ jobs:
role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }}
mask-aws-account-id: true
- name: Setup Node.js
- uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
with:
node-version: "18.20.4"
- name: Setup python
@@ -189,7 +189,7 @@ jobs:
- name: install deps
run: poetry install
- name: Download artifact
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: cdk-layer-artifact-py${{ matrix.python-version }}
path: layer_v3
@@ -213,7 +213,7 @@ jobs:
cat cdk-layer-stack/${{steps.constants.outputs.LAYER_VERSION}}
- name: Save Layer ARN artifact
if: ${{ inputs.stage == 'PROD' }}
- uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: cdk-layer-stack-${{ matrix.region }}-${{ matrix.python-version }}
path: ./layer_v3/cdk-layer-stack/* # NOTE: upload-artifact does not inherit working-directory setting.
diff --git a/.github/workflows/reusable_deploy_v3_sar.yml b/.github/workflows/reusable_deploy_v3_sar.yml
index 6414ba598de..fa136646a4c 100644
--- a/.github/workflows/reusable_deploy_v3_sar.yml
+++ b/.github/workflows/reusable_deploy_v3_sar.yml
@@ -109,11 +109,11 @@ jobs:
role-to-assume: ${{ secrets.AWS_SAR_V3_ROLE_ARN }}
mask-aws-account-id: true
- name: Setup Node.js
- uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
with:
node-version: ${{ env.NODE_VERSION }}
- name: Download artifact
- uses: actions/download-artifact@cc203385981b70ca67e1cc392babf9cc229d5806 # v4.1.9
+ uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1
with:
name: cdk-layer-artifact-py${{ matrix.python-version }}
- name: Unzip artefact
@@ -182,7 +182,7 @@ jobs:
echo "Creating canary stack"
echo "Stack name: $TEST_STACK_NAME"
aws serverlessrepo create-cloud-formation-change-set \
- --application-id arn:aws:serverlessrepo:${{ env.AWS_REGION }}:${{ steps.aws-credentials-sar-role.outputs.aws-account-id }}:applications/${{ env.SAR_NAME }} \
+ --application-id arn:aws:serverlessrepo:${{ env.AWS_REGION }}:${{ secrets.AWS_SAR_V3_ACCOUNTID }}:applications/${{ env.SAR_NAME }} \
--stack-name "${TEST_STACK_NAME/serverlessrepo-/}" \
--capabilities CAPABILITY_NAMED_IAM
@@ -207,5 +207,5 @@ jobs:
sleep 15
echo "Make SAR app public"
aws serverlessrepo put-application-policy \
- --application-id arn:aws:serverlessrepo:${{ env.AWS_REGION }}:${{ steps.aws-credentials-sar-role.outputs.aws-account-id }}:applications/${{ env.SAR_NAME }} \
+ --application-id arn:aws:serverlessrepo:${{ env.AWS_REGION }}:${{ secrets.AWS_SAR_V3_ACCOUNTID }}:applications/${{ env.SAR_NAME }} \
--statements Principals='*',Actions=Deploy
diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml
index d2e2cdc551b..b9cbf34d119 100644
--- a/.github/workflows/run-e2e-tests.yml
+++ b/.github/workflows/run-e2e-tests.yml
@@ -62,7 +62,7 @@ jobs:
architecture: "x64"
cache: "poetry"
- name: Setup Node.js
- uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
+ uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
with:
node-version: "20.10.0"
- name: Install CDK CLI
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 32788f35b45..e9a225cec2c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,93 @@
# Unreleased
+## Bug Fixes
+
+* **idempotency:** include sk in error msgs when using composite key ([#6325](https://github.com/aws-powertools/powertools-lambda-python/issues/6325))
+* **metrics:** ensure proper type conversion for `DD_FLUSH_TO_LOG` env var ([#6280](https://github.com/aws-powertools/powertools-lambda-python/issues/6280))
+
+## Code Refactoring
+
+* **data_classes:** Add base class with common code ([#6297](https://github.com/aws-powertools/powertools-lambda-python/issues/6297))
+* **data_classes:** remove duplicated code ([#6288](https://github.com/aws-powertools/powertools-lambda-python/issues/6288))
+* **data_classes:** simplify nested data classes ([#6289](https://github.com/aws-powertools/powertools-lambda-python/issues/6289))
+* **tests:** add LambdaContext type in tests ([#6214](https://github.com/aws-powertools/powertools-lambda-python/issues/6214))
+
+## Documentation
+
+* **homepage:** update layer instructions link ([#6242](https://github.com/aws-powertools/powertools-lambda-python/issues/6242))
+
+## Features
+
+* **data_classes:** add API Gateway Websocket event ([#6287](https://github.com/aws-powertools/powertools-lambda-python/issues/6287))
+* **event_handler:** add custom method for OpenAPI configuration ([#6204](https://github.com/aws-powertools/powertools-lambda-python/issues/6204))
+* **event_handler:** add custom response validation in OpenAPI utility ([#6189](https://github.com/aws-powertools/powertools-lambda-python/issues/6189))
+* **general:** make logger, tracer and metrics utilities aware of provisioned concurrency ([#6324](https://github.com/aws-powertools/powertools-lambda-python/issues/6324))
+* **metrics:** allow change ColdStart function_name dimension ([#6315](https://github.com/aws-powertools/powertools-lambda-python/issues/6315))
+
+## Maintenance
+
+* **ci:** new pre-release 3.8.1a6 ([#6290](https://github.com/aws-powertools/powertools-lambda-python/issues/6290))
+* **ci:** new pre-release 3.8.1a10 ([#6332](https://github.com/aws-powertools/powertools-lambda-python/issues/6332))
+* **ci:** new pre-release 3.8.1a0 ([#6244](https://github.com/aws-powertools/powertools-lambda-python/issues/6244))
+* **ci:** new pre-release 3.8.1a9 ([#6322](https://github.com/aws-powertools/powertools-lambda-python/issues/6322))
+* **ci:** new pre-release 3.8.1a1 ([#6250](https://github.com/aws-powertools/powertools-lambda-python/issues/6250))
+* **ci:** new pre-release 3.8.1a2 ([#6253](https://github.com/aws-powertools/powertools-lambda-python/issues/6253))
+* **ci:** Fix SAR pipeline ([#6313](https://github.com/aws-powertools/powertools-lambda-python/issues/6313))
+* **ci:** new pre-release 3.8.1a3 ([#6259](https://github.com/aws-powertools/powertools-lambda-python/issues/6259))
+* **ci:** new pre-release 3.8.1a4 ([#6268](https://github.com/aws-powertools/powertools-lambda-python/issues/6268))
+* **ci:** new pre-release 3.8.1a5 ([#6276](https://github.com/aws-powertools/powertools-lambda-python/issues/6276))
+* **ci:** new pre-release 3.8.1a8 ([#6307](https://github.com/aws-powertools/powertools-lambda-python/issues/6307))
+* **ci:** new pre-release 3.8.1a7 ([#6298](https://github.com/aws-powertools/powertools-lambda-python/issues/6298))
+* **deps:** bump actions/upload-artifact from 4.6.1 to 4.6.2 ([#6302](https://github.com/aws-powertools/powertools-lambda-python/issues/6302))
+* **deps:** bump actions/download-artifact from 4.1.9 to 4.2.0 ([#6294](https://github.com/aws-powertools/powertools-lambda-python/issues/6294))
+* **deps:** bump squidfunk/mkdocs-material from `047452c` to `479a06a` in /docs ([#6261](https://github.com/aws-powertools/powertools-lambda-python/issues/6261))
+* **deps:** bump actions/setup-go from 5.3.0 to 5.4.0 ([#6304](https://github.com/aws-powertools/powertools-lambda-python/issues/6304))
+* **deps:** bump actions/download-artifact from 4.2.0 to 4.2.1 ([#6303](https://github.com/aws-powertools/powertools-lambda-python/issues/6303))
+* **deps:** bump actions/setup-node from 4.2.0 to 4.3.0 ([#6278](https://github.com/aws-powertools/powertools-lambda-python/issues/6278))
+* **deps:** bump squidfunk/mkdocs-material from `479a06a` to `f226a2d` in /docs ([#6279](https://github.com/aws-powertools/powertools-lambda-python/issues/6279))
+* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.296 to 0.1.297 ([#6281](https://github.com/aws-powertools/powertools-lambda-python/issues/6281))
+* **deps-dev:** bump boto3-stubs from 1.37.12 to 1.37.14 ([#6282](https://github.com/aws-powertools/powertools-lambda-python/issues/6282))
+* **deps-dev:** bump boto3-stubs from 1.37.14 to 1.37.15 ([#6295](https://github.com/aws-powertools/powertools-lambda-python/issues/6295))
+* **deps-dev:** bump ruff from 0.9.10 to 0.11.0 ([#6273](https://github.com/aws-powertools/powertools-lambda-python/issues/6273))
+* **deps-dev:** bump coverage from 7.6.12 to 7.7.0 ([#6284](https://github.com/aws-powertools/powertools-lambda-python/issues/6284))
+* **deps-dev:** bump aws-cdk-lib from 2.183.0 to 2.184.1 ([#6272](https://github.com/aws-powertools/powertools-lambda-python/issues/6272))
+* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.183.0a0 to 2.184.1a0 ([#6271](https://github.com/aws-powertools/powertools-lambda-python/issues/6271))
+* **deps-dev:** bump filelock from 3.17.0 to 3.18.0 ([#6270](https://github.com/aws-powertools/powertools-lambda-python/issues/6270))
+* **deps-dev:** bump cfn-lint from 1.30.0 to 1.31.0 ([#6296](https://github.com/aws-powertools/powertools-lambda-python/issues/6296))
+* **deps-dev:** bump boto3-stubs from 1.37.11 to 1.37.12 ([#6266](https://github.com/aws-powertools/powertools-lambda-python/issues/6266))
+* **deps-dev:** bump boto3-stubs from 1.37.15 to 1.37.16 ([#6305](https://github.com/aws-powertools/powertools-lambda-python/issues/6305))
+* **deps-dev:** bump mkdocs-material from 9.6.7 to 9.6.8 ([#6264](https://github.com/aws-powertools/powertools-lambda-python/issues/6264))
+* **deps-dev:** bump cfn-lint from 1.29.1 to 1.30.0 ([#6263](https://github.com/aws-powertools/powertools-lambda-python/issues/6263))
+* **deps-dev:** bump aws-cdk from 2.1003.0 to 2.1004.0 ([#6262](https://github.com/aws-powertools/powertools-lambda-python/issues/6262))
+* **deps-dev:** bump mkdocs-material from 9.6.8 to 9.6.9 ([#6285](https://github.com/aws-powertools/powertools-lambda-python/issues/6285))
+* **deps-dev:** bump cfn-lint from 1.31.0 to 1.31.3 ([#6306](https://github.com/aws-powertools/powertools-lambda-python/issues/6306))
+* **deps-dev:** bump sentry-sdk from 2.23.1 to 2.24.0 ([#6329](https://github.com/aws-powertools/powertools-lambda-python/issues/6329))
+* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.182.0a0 to 2.183.0a0 ([#6258](https://github.com/aws-powertools/powertools-lambda-python/issues/6258))
+* **deps-dev:** bump aws-cdk-lib from 2.182.0 to 2.183.0 ([#6257](https://github.com/aws-powertools/powertools-lambda-python/issues/6257))
+* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.184.1a0 to 2.185.0a0 ([#6317](https://github.com/aws-powertools/powertools-lambda-python/issues/6317))
+* **deps-dev:** bump cfn-lint from 1.31.3 to 1.32.0 ([#6316](https://github.com/aws-powertools/powertools-lambda-python/issues/6316))
+* **deps-dev:** bump boto3-stubs from 1.37.10 to 1.37.11 ([#6252](https://github.com/aws-powertools/powertools-lambda-python/issues/6252))
+* **deps-dev:** bump mkdocstrings-python from 1.16.6 to 1.16.7 ([#6319](https://github.com/aws-powertools/powertools-lambda-python/issues/6319))
+* **deps-dev:** bump cfn-lint from 1.28.0 to 1.29.1 ([#6249](https://github.com/aws-powertools/powertools-lambda-python/issues/6249))
+* **deps-dev:** bump boto3-stubs from 1.37.8 to 1.37.10 ([#6248](https://github.com/aws-powertools/powertools-lambda-python/issues/6248))
+* **deps-dev:** bump ruff from 0.11.0 to 0.11.1 ([#6320](https://github.com/aws-powertools/powertools-lambda-python/issues/6320))
+* **deps-dev:** bump ruff from 0.11.1 to 0.11.2 ([#6326](https://github.com/aws-powertools/powertools-lambda-python/issues/6326))
+* **deps-dev:** bump coverage from 7.7.0 to 7.7.1 ([#6328](https://github.com/aws-powertools/powertools-lambda-python/issues/6328))
+* **deps-dev:** bump aws-cdk from 2.1004.0 to 2.1005.0 ([#6301](https://github.com/aws-powertools/powertools-lambda-python/issues/6301))
+* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.295 to 0.1.296 ([#6240](https://github.com/aws-powertools/powertools-lambda-python/issues/6240))
+* **deps-dev:** bump boto3-stubs from 1.37.7 to 1.37.8 ([#6239](https://github.com/aws-powertools/powertools-lambda-python/issues/6239))
+* **deps-dev:** bump boto3-stubs from 1.37.16 to 1.37.18 ([#6327](https://github.com/aws-powertools/powertools-lambda-python/issues/6327))
+* **deps-dev:** bump ruff from 0.9.9 to 0.9.10 ([#6241](https://github.com/aws-powertools/powertools-lambda-python/issues/6241))
+* **logger:** clear prev request buffers in manual mode ([#6314](https://github.com/aws-powertools/powertools-lambda-python/issues/6314))
+
+
+
+## [v3.8.0] - 2025-03-07
+## Bug Fixes
+
+* **event_handler:** revert regression when validating response ([#6234](https://github.com/aws-powertools/powertools-lambda-python/issues/6234))
+
## Code Refactoring
* **tracer:** fix capture_lambda_handler return type annotation ([#6197](https://github.com/aws-powertools/powertools-lambda-python/issues/6197))
@@ -14,54 +101,59 @@
## Features
+* **logger:** add logger buffer feature ([#6060](https://github.com/aws-powertools/powertools-lambda-python/issues/6060))
* **logger:** add new logic to sample debug logs ([#6142](https://github.com/aws-powertools/powertools-lambda-python/issues/6142))
## Maintenance
+* version bump
+* **ci:** new pre-release 3.7.1a2 ([#6186](https://github.com/aws-powertools/powertools-lambda-python/issues/6186))
* **ci:** new pre-release 3.7.1a0 ([#6166](https://github.com/aws-powertools/powertools-lambda-python/issues/6166))
-* **ci:** new pre-release 3.7.1a1 ([#6178](https://github.com/aws-powertools/powertools-lambda-python/issues/6178))
* **ci:** new pre-release 3.7.1a6 ([#6229](https://github.com/aws-powertools/powertools-lambda-python/issues/6229))
-* **ci:** new pre-release 3.7.1a2 ([#6186](https://github.com/aws-powertools/powertools-lambda-python/issues/6186))
-* **ci:** new pre-release 3.7.1a5 ([#6219](https://github.com/aws-powertools/powertools-lambda-python/issues/6219))
+* **ci:** new pre-release 3.7.1a7 ([#6233](https://github.com/aws-powertools/powertools-lambda-python/issues/6233))
+* **ci:** new pre-release 3.7.1a1 ([#6178](https://github.com/aws-powertools/powertools-lambda-python/issues/6178))
* **ci:** enable SAR deployment ([#6104](https://github.com/aws-powertools/powertools-lambda-python/issues/6104))
-* **ci:** new pre-release 3.7.1a4 ([#6211](https://github.com/aws-powertools/powertools-lambda-python/issues/6211))
+* **ci:** new pre-release 3.7.1a5 ([#6219](https://github.com/aws-powertools/powertools-lambda-python/issues/6219))
* **ci:** new pre-release 3.7.1a3 ([#6201](https://github.com/aws-powertools/powertools-lambda-python/issues/6201))
-* **deps:** bump jinja2 from 3.1.5 to 3.1.6 in /docs ([#6223](https://github.com/aws-powertools/powertools-lambda-python/issues/6223))
+* **ci:** new pre-release 3.7.1a4 ([#6211](https://github.com/aws-powertools/powertools-lambda-python/issues/6211))
+* **deps:** bump docker/setup-qemu-action from 3.5.0 to 3.6.0 ([#6190](https://github.com/aws-powertools/powertools-lambda-python/issues/6190))
* **deps:** bump actions/download-artifact from 4.1.8 to 4.1.9 ([#6174](https://github.com/aws-powertools/powertools-lambda-python/issues/6174))
+* **deps:** bump squidfunk/mkdocs-material from `2615302` to `047452c` in /docs ([#6210](https://github.com/aws-powertools/powertools-lambda-python/issues/6210))
* **deps:** bump docker/setup-qemu-action from 3.4.0 to 3.5.0 ([#6176](https://github.com/aws-powertools/powertools-lambda-python/issues/6176))
* **deps:** bump docker/setup-buildx-action from 3.9.0 to 3.10.0 ([#6175](https://github.com/aws-powertools/powertools-lambda-python/issues/6175))
+* **deps:** bump datadog-lambda from 6.105.0 to 6.106.0 ([#6218](https://github.com/aws-powertools/powertools-lambda-python/issues/6218))
* **deps:** bump codecov/codecov-action from 5.3.1 to 5.4.0 ([#6180](https://github.com/aws-powertools/powertools-lambda-python/issues/6180))
* **deps:** bump pydantic-settings from 2.8.0 to 2.8.1 ([#6182](https://github.com/aws-powertools/powertools-lambda-python/issues/6182))
-* **deps:** bump datadog-lambda from 6.105.0 to 6.106.0 ([#6218](https://github.com/aws-powertools/powertools-lambda-python/issues/6218))
-* **deps:** bump docker/setup-qemu-action from 3.5.0 to 3.6.0 ([#6190](https://github.com/aws-powertools/powertools-lambda-python/issues/6190))
-* **deps:** bump squidfunk/mkdocs-material from `2615302` to `047452c` in /docs ([#6210](https://github.com/aws-powertools/powertools-lambda-python/issues/6210))
+* **deps:** bump jinja2 from 3.1.5 to 3.1.6 in /docs ([#6223](https://github.com/aws-powertools/powertools-lambda-python/issues/6223))
+* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.294 to 0.1.295 ([#6207](https://github.com/aws-powertools/powertools-lambda-python/issues/6207))
* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.293 to 0.1.294 ([#6193](https://github.com/aws-powertools/powertools-lambda-python/issues/6193))
+* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.181.0a0 to 2.181.1a0 ([#6194](https://github.com/aws-powertools/powertools-lambda-python/issues/6194))
* **deps-dev:** bump ruff from 0.9.8 to 0.9.9 ([#6195](https://github.com/aws-powertools/powertools-lambda-python/issues/6195))
-* **deps-dev:** bump cfn-lint from 1.26.1 to 1.27.0 ([#6192](https://github.com/aws-powertools/powertools-lambda-python/issues/6192))
-* **deps-dev:** bump boto3-stubs from 1.37.4 to 1.37.5 ([#6217](https://github.com/aws-powertools/powertools-lambda-python/issues/6217))
* **deps-dev:** bump aws-cdk-lib from 2.181.1 to 2.182.0 ([#6222](https://github.com/aws-powertools/powertools-lambda-python/issues/6222))
+* **deps-dev:** bump testcontainers from 4.9.1 to 4.9.2 ([#6225](https://github.com/aws-powertools/powertools-lambda-python/issues/6225))
+* **deps-dev:** bump cfn-lint from 1.26.1 to 1.27.0 ([#6192](https://github.com/aws-powertools/powertools-lambda-python/issues/6192))
* **deps-dev:** bump boto3-stubs from 1.37.2 to 1.37.3 ([#6181](https://github.com/aws-powertools/powertools-lambda-python/issues/6181))
* **deps-dev:** bump isort from 6.0.0 to 6.0.1 ([#6183](https://github.com/aws-powertools/powertools-lambda-python/issues/6183))
-* **deps-dev:** bump pytest from 8.3.4 to 8.3.5 ([#6206](https://github.com/aws-powertools/powertools-lambda-python/issues/6206))
+* **deps-dev:** bump boto3-stubs from 1.37.5 to 1.37.6 ([#6227](https://github.com/aws-powertools/powertools-lambda-python/issues/6227))
* **deps-dev:** bump ruff from 0.9.7 to 0.9.8 ([#6184](https://github.com/aws-powertools/powertools-lambda-python/issues/6184))
-* **deps-dev:** bump mkdocs-material from 9.6.5 to 9.6.7 ([#6208](https://github.com/aws-powertools/powertools-lambda-python/issues/6208))
-* **deps-dev:** bump testcontainers from 4.9.1 to 4.9.2 ([#6225](https://github.com/aws-powertools/powertools-lambda-python/issues/6225))
+* **deps-dev:** bump boto3-stubs from 1.37.4 to 1.37.5 ([#6217](https://github.com/aws-powertools/powertools-lambda-python/issues/6217))
* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.181.1a0 to 2.182.0a0 ([#6226](https://github.com/aws-powertools/powertools-lambda-python/issues/6226))
-* **deps-dev:** bump cdklabs-generative-ai-cdk-constructs from 0.1.294 to 0.1.295 ([#6207](https://github.com/aws-powertools/powertools-lambda-python/issues/6207))
+* **deps-dev:** bump cfn-lint from 1.27.0 to 1.28.0 ([#6228](https://github.com/aws-powertools/powertools-lambda-python/issues/6228))
+* **deps-dev:** bump pytest from 8.3.4 to 8.3.5 ([#6206](https://github.com/aws-powertools/powertools-lambda-python/issues/6206))
* **deps-dev:** bump boto3-stubs from 1.37.0 to 1.37.1 ([#6170](https://github.com/aws-powertools/powertools-lambda-python/issues/6170))
-* **deps-dev:** bump aws-cdk from 2.1001.0 to 2.1002.0 ([#6209](https://github.com/aws-powertools/powertools-lambda-python/issues/6209))
* **deps-dev:** bump boto3-stubs from 1.37.3 to 1.37.4 ([#6205](https://github.com/aws-powertools/powertools-lambda-python/issues/6205))
+* **deps-dev:** bump mkdocs-material from 9.6.5 to 9.6.7 ([#6208](https://github.com/aws-powertools/powertools-lambda-python/issues/6208))
* **deps-dev:** bump aws-cdk from 2.1000.3 to 2.1001.0 ([#6173](https://github.com/aws-powertools/powertools-lambda-python/issues/6173))
* **deps-dev:** bump cfn-lint from 1.26.0 to 1.26.1 ([#6169](https://github.com/aws-powertools/powertools-lambda-python/issues/6169))
* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.180.0a0 to 2.181.0a0 ([#6172](https://github.com/aws-powertools/powertools-lambda-python/issues/6172))
-* **deps-dev:** bump cfn-lint from 1.27.0 to 1.28.0 ([#6228](https://github.com/aws-powertools/powertools-lambda-python/issues/6228))
-* **deps-dev:** bump boto3-stubs from 1.37.5 to 1.37.6 ([#6227](https://github.com/aws-powertools/powertools-lambda-python/issues/6227))
+* **deps-dev:** bump jinja2 from 3.1.5 to 3.1.6 ([#6224](https://github.com/aws-powertools/powertools-lambda-python/issues/6224))
+* **deps-dev:** bump aws-cdk from 2.1002.0 to 2.1003.0 ([#6232](https://github.com/aws-powertools/powertools-lambda-python/issues/6232))
* **deps-dev:** bump cfn-lint from 1.25.1 to 1.26.0 ([#6164](https://github.com/aws-powertools/powertools-lambda-python/issues/6164))
* **deps-dev:** bump boto3-stubs from 1.36.26 to 1.37.0 ([#6165](https://github.com/aws-powertools/powertools-lambda-python/issues/6165))
* **deps-dev:** bump mypy-boto3-appconfigdata from 1.36.0 to 1.37.0 in the boto-typing group ([#6163](https://github.com/aws-powertools/powertools-lambda-python/issues/6163))
* **deps-dev:** bump aws-cdk from 2.1000.2 to 2.1000.3 ([#6162](https://github.com/aws-powertools/powertools-lambda-python/issues/6162))
-* **deps-dev:** bump jinja2 from 3.1.5 to 3.1.6 ([#6224](https://github.com/aws-powertools/powertools-lambda-python/issues/6224))
-* **deps-dev:** bump aws-cdk-aws-lambda-python-alpha from 2.181.0a0 to 2.181.1a0 ([#6194](https://github.com/aws-powertools/powertools-lambda-python/issues/6194))
+* **deps-dev:** bump boto3-stubs from 1.37.6 to 1.37.7 ([#6231](https://github.com/aws-powertools/powertools-lambda-python/issues/6231))
+* **deps-dev:** bump aws-cdk from 2.1001.0 to 2.1002.0 ([#6209](https://github.com/aws-powertools/powertools-lambda-python/issues/6209))
@@ -6175,7 +6267,8 @@
* Merge pull request [#5](https://github.com/aws-powertools/powertools-lambda-python/issues/5) from jfuss/feat/python38
-[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.7.0...HEAD
+[Unreleased]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.8.0...HEAD
+[v3.8.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.7.0...v3.8.0
[v3.7.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.6.0...v3.7.0
[v3.6.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.5.0...v3.6.0
[v3.5.0]: https://github.com/aws-powertools/powertools-lambda-python/compare/v3.4.1...v3.5.0
diff --git a/Makefile b/Makefile
index 4bb1e78390c..bde5516a832 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ dev-gitpod:
# Running licensecheck with zero to break the pipeline if there is an invalid license
check-licenses:
- poetry run licensecheck -u poetry:dev --zero
+ poetry run licensecheck -u poetry:dev
format:
poetry run black aws_lambda_powertools tests examples
@@ -84,7 +84,7 @@ complexity-baseline:
$(info Maintenability index)
poetry run radon mi aws_lambda_powertools
$(info Cyclomatic complexity index)
- poetry run xenon --max-absolute C --max-modules A --max-average A aws_lambda_powertools --exclude aws_lambda_powertools/shared/json_encoder.py,aws_lambda_powertools/utilities/validation/base.py
+ poetry run xenon --max-absolute C --max-modules A --max-average A aws_lambda_powertools --exclude aws_lambda_powertools/shared/json_encoder.py,aws_lambda_powertools/utilities/validation/base.py,aws_lambda_powertools/event_handler/api_gateway.py
#
# Use `poetry version /` for version bump
diff --git a/README.md b/README.md
index 9671346c91f..b8156f1936a 100644
--- a/README.md
+++ b/README.md
@@ -65,6 +65,7 @@ The following companies, among others, use Powertools:
* [CyberArk](https://www.cyberark.com/)
* [Flyweight](https://flyweight.io/)
* [globaldatanet](https://globaldatanet.com/)
+* [Guild](https://guild.com/)
* [IMS](https://ims.tech/)
* [Jit Security](https://www.jit.io/)
* [LocalStack](https://www.localstack.cloud/)
diff --git a/aws_lambda_powertools/event_handler/api_gateway.py b/aws_lambda_powertools/event_handler/api_gateway.py
index 5eba4220c22..c8e4248fda4 100644
--- a/aws_lambda_powertools/event_handler/api_gateway.py
+++ b/aws_lambda_powertools/event_handler/api_gateway.py
@@ -18,8 +18,17 @@
from aws_lambda_powertools.event_handler import content_types
from aws_lambda_powertools.event_handler.exceptions import NotFoundError, ServiceError
-from aws_lambda_powertools.event_handler.openapi.constants import DEFAULT_API_VERSION, DEFAULT_OPENAPI_VERSION
-from aws_lambda_powertools.event_handler.openapi.exceptions import RequestValidationError, SchemaValidationError
+from aws_lambda_powertools.event_handler.openapi.config import OpenAPIConfig
+from aws_lambda_powertools.event_handler.openapi.constants import (
+ DEFAULT_API_VERSION,
+ DEFAULT_OPENAPI_TITLE,
+ DEFAULT_OPENAPI_VERSION,
+)
+from aws_lambda_powertools.event_handler.openapi.exceptions import (
+ RequestValidationError,
+ ResponseValidationError,
+ SchemaValidationError,
+)
from aws_lambda_powertools.event_handler.openapi.types import (
COMPONENT_REF_PREFIX,
METHODS_WITH_BODY,
@@ -1496,6 +1505,7 @@ def __init__(
serializer: Callable[[dict], str] | None = None,
strip_prefixes: list[str | Pattern] | None = None,
enable_validation: bool = False,
+ response_validation_error_http_code: HTTPStatus | int | None = None,
):
"""
Parameters
@@ -1515,6 +1525,8 @@ def __init__(
Each prefix can be a static string or a compiled regex pattern
enable_validation: bool | None
Enables validation of the request body against the route schema, by default False.
+ response_validation_error_http_code
+ Sets the returned status code if response is not validated. enable_validation must be True.
"""
self._proxy_type = proxy_type
self._dynamic_routes: list[Route] = []
@@ -1530,6 +1542,12 @@ def __init__(
self.context: dict = {} # early init as customers might add context before event resolution
self.processed_stack_frames = []
self._response_builder_class = ResponseBuilder[BaseProxyEvent]
+ self.openapi_config = OpenAPIConfig() # starting an empty dataclass
+ self._has_response_validation_error = response_validation_error_http_code is not None
+ self._response_validation_error_http_code = self._validate_response_validation_error_http_code(
+ response_validation_error_http_code,
+ enable_validation,
+ )
# Allow for a custom serializer or a concise json serialization
self._serializer = serializer or partial(json.dumps, separators=(",", ":"), cls=Encoder)
@@ -1539,12 +1557,41 @@ def __init__(
# Note the serializer argument: only use custom serializer if provided by the caller
# Otherwise, fully rely on the internal Pydantic based mechanism to serialize responses for validation.
- self.use([OpenAPIValidationMiddleware(validation_serializer=serializer)])
+ self.use(
+ [
+ OpenAPIValidationMiddleware(
+ validation_serializer=serializer,
+ has_response_validation_error=self._has_response_validation_error,
+ ),
+ ],
+ )
+
+ def _validate_response_validation_error_http_code(
+ self,
+ response_validation_error_http_code: HTTPStatus | int | None,
+ enable_validation: bool,
+ ) -> HTTPStatus:
+ if response_validation_error_http_code and not enable_validation:
+ msg = "'response_validation_error_http_code' cannot be set when enable_validation is False."
+ raise ValueError(msg)
+
+ if (
+ not isinstance(response_validation_error_http_code, HTTPStatus)
+ and response_validation_error_http_code is not None
+ ):
+
+ try:
+ response_validation_error_http_code = HTTPStatus(response_validation_error_http_code)
+ except ValueError:
+ msg = f"'{response_validation_error_http_code}' must be an integer representing an HTTP status code."
+ raise ValueError(msg) from None
+
+ return response_validation_error_http_code or HTTPStatus.UNPROCESSABLE_ENTITY
def get_openapi_schema(
self,
*,
- title: str = "Powertools API",
+ title: str = DEFAULT_OPENAPI_TITLE,
version: str = DEFAULT_API_VERSION,
openapi_version: str = DEFAULT_OPENAPI_VERSION,
summary: str | None = None,
@@ -1596,6 +1643,29 @@ def get_openapi_schema(
The OpenAPI schema as a pydantic model.
"""
+ # DEPRECATION: Will be removed in v4.0.0. Use configure_api() instead.
+ # Maintained for backwards compatibility.
+ # See: https://github.com/aws-powertools/powertools-lambda-python/issues/6122
+ if title == DEFAULT_OPENAPI_TITLE and self.openapi_config.title:
+ title = self.openapi_config.title
+
+ if version == DEFAULT_API_VERSION and self.openapi_config.version:
+ version = self.openapi_config.version
+
+ if openapi_version == DEFAULT_OPENAPI_VERSION and self.openapi_config.openapi_version:
+ openapi_version = self.openapi_config.openapi_version
+
+ summary = summary or self.openapi_config.summary
+ description = description or self.openapi_config.description
+ tags = tags or self.openapi_config.tags
+ servers = servers or self.openapi_config.servers
+ terms_of_service = terms_of_service or self.openapi_config.terms_of_service
+ contact = contact or self.openapi_config.contact
+ license_info = license_info or self.openapi_config.license_info
+ security_schemes = security_schemes or self.openapi_config.security_schemes
+ security = security or self.openapi_config.security
+ openapi_extensions = openapi_extensions or self.openapi_config.openapi_extensions
+
from aws_lambda_powertools.event_handler.openapi.compat import (
GenerateJsonSchema,
get_compat_model_name_map,
@@ -1694,7 +1764,7 @@ def _get_openapi_servers(servers: list[Server] | None) -> list[Server]:
# If the 'servers' property is not provided or is an empty array,
# the default behavior is to return a Server Object with a URL value of "/".
- return servers if servers else [Server(url="/")]
+ return servers or [Server(url="/")]
@staticmethod
def _get_openapi_security(
@@ -1726,7 +1796,7 @@ def _determine_openapi_version(openapi_version: str):
def get_openapi_json_schema(
self,
*,
- title: str = "Powertools API",
+ title: str = DEFAULT_OPENAPI_TITLE,
version: str = DEFAULT_API_VERSION,
openapi_version: str = DEFAULT_OPENAPI_VERSION,
summary: str | None = None,
@@ -1777,6 +1847,7 @@ def get_openapi_json_schema(
str
The OpenAPI schema as a JSON serializable dict.
"""
+
from aws_lambda_powertools.event_handler.openapi.compat import model_json
return model_json(
@@ -1800,11 +1871,94 @@ def get_openapi_json_schema(
indent=2,
)
+ def configure_openapi(
+ self,
+ title: str = DEFAULT_OPENAPI_TITLE,
+ version: str = DEFAULT_API_VERSION,
+ openapi_version: str = DEFAULT_OPENAPI_VERSION,
+ summary: str | None = None,
+ description: str | None = None,
+ tags: list[Tag | str] | None = None,
+ servers: list[Server] | None = None,
+ terms_of_service: str | None = None,
+ contact: Contact | None = None,
+ license_info: License | None = None,
+ security_schemes: dict[str, SecurityScheme] | None = None,
+ security: list[dict[str, list[str]]] | None = None,
+ openapi_extensions: dict[str, Any] | None = None,
+ ):
+ """Configure OpenAPI specification settings for the API.
+
+ Sets up the OpenAPI documentation configuration that can be later used
+ when enabling Swagger UI or generating OpenAPI specifications.
+
+ Parameters
+ ----------
+ title: str
+ The title of the application.
+ version: str
+ The version of the OpenAPI document (which is distinct from the OpenAPI Specification version or the API
+ openapi_version: str, default = "3.0.0"
+ The version of the OpenAPI Specification (which the document uses).
+ summary: str, optional
+ A short summary of what the application does.
+ description: str, optional
+ A verbose explanation of the application behavior.
+ tags: list[Tag, str], optional
+ A list of tags used by the specification with additional metadata.
+ servers: list[Server], optional
+ An array of Server Objects, which provide connectivity information to a target server.
+ terms_of_service: str, optional
+ A URL to the Terms of Service for the API. MUST be in the format of a URL.
+ contact: Contact, optional
+ The contact information for the exposed API.
+ license_info: License, optional
+ The license information for the exposed API.
+ security_schemes: dict[str, SecurityScheme]], optional
+ A declaration of the security schemes available to be used in the specification.
+ security: list[dict[str, list[str]]], optional
+ A declaration of which security mechanisms are applied globally across the API.
+ openapi_extensions: Dict[str, Any], optional
+ Additional OpenAPI extensions as a dictionary.
+
+ Example
+ --------
+ >>> api.configure_openapi(
+ ... title="My API",
+ ... version="1.0.0",
+ ... description="API for managing resources",
+ ... contact=Contact(
+ ... name="API Support",
+ ... email="support@example.com"
+ ... )
+ ... )
+
+ See Also
+ --------
+ enable_swagger : Method to enable Swagger UI using these configurations
+ OpenAPIConfig : Data class containing all OpenAPI configuration options
+ """
+ self.openapi_config = OpenAPIConfig(
+ title=title,
+ version=version,
+ openapi_version=openapi_version,
+ summary=summary,
+ description=description,
+ tags=tags,
+ servers=servers,
+ terms_of_service=terms_of_service,
+ contact=contact,
+ license_info=license_info,
+ security_schemes=security_schemes,
+ security=security,
+ openapi_extensions=openapi_extensions,
+ )
+
def enable_swagger(
self,
*,
path: str = "/swagger",
- title: str = "Powertools for AWS Lambda (Python) API",
+ title: str = DEFAULT_OPENAPI_TITLE,
version: str = DEFAULT_API_VERSION,
openapi_version: str = DEFAULT_OPENAPI_VERSION,
summary: str | None = None,
@@ -1867,6 +2021,7 @@ def enable_swagger(
openapi_extensions: dict[str, Any], optional
Additional OpenAPI extensions as a dictionary.
"""
+
from aws_lambda_powertools.event_handler.openapi.compat import model_json
from aws_lambda_powertools.event_handler.openapi.models import Server
from aws_lambda_powertools.event_handler.openapi.swagger_ui import (
@@ -2111,10 +2266,7 @@ def _get_base_path(self) -> str:
@staticmethod
def _has_debug(debug: bool | None = None) -> bool:
# It might have been explicitly switched off (debug=False)
- if debug is not None:
- return debug
-
- return powertools_dev_is_set()
+ return debug if debug is not None else powertools_dev_is_set()
@staticmethod
def _compile_regex(rule: str, base_regex: str = _ROUTE_REGEX):
@@ -2227,7 +2379,7 @@ def _path_starts_with(path: str, prefix: str):
if not isinstance(prefix, str) or prefix == "":
return False
- return path.startswith(prefix + "/")
+ return path.startswith(f"{prefix}/")
def _handle_not_found(self, method: str, path: str) -> ResponseBuilder:
"""Called when no matching route was found and includes support for the cors preflight response"""
@@ -2370,6 +2522,21 @@ def _call_exception_handler(self, exp: Exception, route: Route) -> ResponseBuild
route=route,
)
+ # OpenAPIValidationMiddleware will only raise ResponseValidationError when
+ # 'self._response_validation_error_http_code' is not None
+ if isinstance(exp, ResponseValidationError):
+ http_code = self._response_validation_error_http_code
+ errors = [{"loc": e["loc"], "type": e["type"]} for e in exp.errors()]
+ return self._response_builder_class(
+ response=Response(
+ status_code=http_code.value,
+ content_type=content_types.APPLICATION_JSON,
+ body={"statusCode": self._response_validation_error_http_code, "detail": errors},
+ ),
+ serializer=self._serializer,
+ route=route,
+ )
+
if isinstance(exp, ServiceError):
return self._response_builder_class(
response=Response(
@@ -2483,8 +2650,9 @@ def _get_fields_from_routes(routes: Sequence[Route]) -> list[ModelField]:
if route.dependant.response_extra_models:
responses_from_routes.extend(route.dependant.response_extra_models)
- flat_models = list(responses_from_routes + request_fields_from_routes + body_fields_from_routes)
- return flat_models
+ return list(
+ responses_from_routes + request_fields_from_routes + body_fields_from_routes,
+ )
class Router(BaseRouter):
@@ -2582,6 +2750,7 @@ def __init__(
serializer: Callable[[dict], str] | None = None,
strip_prefixes: list[str | Pattern] | None = None,
enable_validation: bool = False,
+ response_validation_error_http_code: HTTPStatus | int | None = None,
):
"""Amazon API Gateway REST and HTTP API v1 payload resolver"""
super().__init__(
@@ -2591,6 +2760,7 @@ def __init__(
serializer,
strip_prefixes,
enable_validation,
+ response_validation_error_http_code,
)
def _get_base_path(self) -> str:
@@ -2664,6 +2834,7 @@ def __init__(
serializer: Callable[[dict], str] | None = None,
strip_prefixes: list[str | Pattern] | None = None,
enable_validation: bool = False,
+ response_validation_error_http_code: HTTPStatus | int | None = None,
):
"""Amazon API Gateway HTTP API v2 payload resolver"""
super().__init__(
@@ -2673,6 +2844,7 @@ def __init__(
serializer,
strip_prefixes,
enable_validation,
+ response_validation_error_http_code,
)
def _get_base_path(self) -> str:
@@ -2701,9 +2873,18 @@ def __init__(
serializer: Callable[[dict], str] | None = None,
strip_prefixes: list[str | Pattern] | None = None,
enable_validation: bool = False,
+ response_validation_error_http_code: HTTPStatus | int | None = None,
):
"""Amazon Application Load Balancer (ALB) resolver"""
- super().__init__(ProxyEventType.ALBEvent, cors, debug, serializer, strip_prefixes, enable_validation)
+ super().__init__(
+ ProxyEventType.ALBEvent,
+ cors,
+ debug,
+ serializer,
+ strip_prefixes,
+ enable_validation,
+ response_validation_error_http_code,
+ )
def _get_base_path(self) -> str:
# ALB doesn't have a stage variable, so we just return an empty string
diff --git a/aws_lambda_powertools/event_handler/lambda_function_url.py b/aws_lambda_powertools/event_handler/lambda_function_url.py
index c7075cd9fc6..c761834e8b3 100644
--- a/aws_lambda_powertools/event_handler/lambda_function_url.py
+++ b/aws_lambda_powertools/event_handler/lambda_function_url.py
@@ -8,6 +8,8 @@
)
if TYPE_CHECKING:
+ from http import HTTPStatus
+
from aws_lambda_powertools.event_handler import CORSConfig
from aws_lambda_powertools.utilities.data_classes import LambdaFunctionUrlEvent
@@ -57,6 +59,7 @@ def __init__(
serializer: Callable[[dict], str] | None = None,
strip_prefixes: list[str | Pattern] | None = None,
enable_validation: bool = False,
+ response_validation_error_http_code: HTTPStatus | int | None = None,
):
super().__init__(
ProxyEventType.LambdaFunctionUrlEvent,
@@ -65,6 +68,7 @@ def __init__(
serializer,
strip_prefixes,
enable_validation,
+ response_validation_error_http_code,
)
def _get_base_path(self) -> str:
diff --git a/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py b/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py
index fc0db9a3b3f..a1490eb23ec 100644
--- a/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py
+++ b/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py
@@ -17,7 +17,7 @@
)
from aws_lambda_powertools.event_handler.openapi.dependant import is_scalar_field
from aws_lambda_powertools.event_handler.openapi.encoders import jsonable_encoder
-from aws_lambda_powertools.event_handler.openapi.exceptions import RequestValidationError
+from aws_lambda_powertools.event_handler.openapi.exceptions import RequestValidationError, ResponseValidationError
from aws_lambda_powertools.event_handler.openapi.params import Param
if TYPE_CHECKING:
@@ -58,7 +58,11 @@ def get_todos(): list[Todo]:
```
"""
- def __init__(self, validation_serializer: Callable[[Any], str] | None = None):
+ def __init__(
+ self,
+ validation_serializer: Callable[[Any], str] | None = None,
+ has_response_validation_error: bool = False,
+ ):
"""
Initialize the OpenAPIValidationMiddleware.
@@ -67,8 +71,13 @@ def __init__(self, validation_serializer: Callable[[Any], str] | None = None):
validation_serializer : Callable, optional
Optional serializer to use when serializing the response for validation.
Use it when you have a custom type that cannot be serialized by the default jsonable_encoder.
+
+ has_response_validation_error: bool, optional
+ Optional flag used to distinguish between payload and validation errors.
+ By setting this flag to True, ResponseValidationError will be raised if response could not be validated.
"""
self._validation_serializer = validation_serializer
+ self._has_response_validation_error = has_response_validation_error
def handler(self, app: EventHandlerInstance, next_middleware: NextMiddleware) -> Response:
logger.debug("OpenAPIValidationMiddleware handler")
@@ -164,6 +173,8 @@ def _serialize_response(
errors: list[dict[str, Any]] = []
value = _validate_field(field=field, value=response_content, loc=("response",), existing_errors=errors)
if errors:
+ if self._has_response_validation_error:
+ raise ResponseValidationError(errors=_normalize_errors(errors), body=response_content)
raise RequestValidationError(errors=_normalize_errors(errors), body=response_content)
if hasattr(field, "serialize"):
diff --git a/aws_lambda_powertools/event_handler/openapi/config.py b/aws_lambda_powertools/event_handler/openapi/config.py
new file mode 100644
index 00000000000..597362d1ef9
--- /dev/null
+++ b/aws_lambda_powertools/event_handler/openapi/config.py
@@ -0,0 +1,80 @@
+from __future__ import annotations
+
+from dataclasses import dataclass
+from typing import TYPE_CHECKING, Any
+
+from aws_lambda_powertools.event_handler.openapi.constants import (
+ DEFAULT_API_VERSION,
+ DEFAULT_OPENAPI_TITLE,
+ DEFAULT_OPENAPI_VERSION,
+)
+
+if TYPE_CHECKING:
+ from aws_lambda_powertools.event_handler.openapi.models import (
+ Contact,
+ License,
+ SecurityScheme,
+ Server,
+ Tag,
+ )
+
+
+@dataclass
+class OpenAPIConfig:
+ """Configuration class for OpenAPI specification.
+
+ This class holds all the necessary configuration parameters to generate an OpenAPI specification.
+
+ Parameters
+ ----------
+ title: str
+ The title of the application.
+ version: str
+ The version of the OpenAPI document (which is distinct from the OpenAPI Specification version or the API
+ openapi_version: str, default = "3.0.0"
+ The version of the OpenAPI Specification (which the document uses).
+ summary: str, optional
+ A short summary of what the application does.
+ description: str, optional
+ A verbose explanation of the application behavior.
+ tags: list[Tag, str], optional
+ A list of tags used by the specification with additional metadata.
+ servers: list[Server], optional
+ An array of Server Objects, which provide connectivity information to a target server.
+ terms_of_service: str, optional
+ A URL to the Terms of Service for the API. MUST be in the format of a URL.
+ contact: Contact, optional
+ The contact information for the exposed API.
+ license_info: License, optional
+ The license information for the exposed API.
+ security_schemes: dict[str, SecurityScheme]], optional
+ A declaration of the security schemes available to be used in the specification.
+ security: list[dict[str, list[str]]], optional
+ A declaration of which security mechanisms are applied globally across the API.
+ openapi_extensions: Dict[str, Any], optional
+ Additional OpenAPI extensions as a dictionary.
+
+ Example
+ --------
+ >>> config = OpenAPIConfig(
+ ... title="My API",
+ ... version="1.0.0",
+ ... description="This is my API description",
+ ... contact=Contact(name="API Support", email="support@example.com"),
+ ... servers=[Server(url="https://api.example.com/v1")]
+ ... )
+ """
+
+ title: str = DEFAULT_OPENAPI_TITLE
+ version: str = DEFAULT_API_VERSION
+ openapi_version: str = DEFAULT_OPENAPI_VERSION
+ summary: str | None = None
+ description: str | None = None
+ tags: list[Tag | str] | None = None
+ servers: list[Server] | None = None
+ terms_of_service: str | None = None
+ contact: Contact | None = None
+ license_info: License | None = None
+ security_schemes: dict[str, SecurityScheme] | None = None
+ security: list[dict[str, list[str]]] | None = None
+ openapi_extensions: dict[str, Any] | None = None
diff --git a/aws_lambda_powertools/event_handler/openapi/constants.py b/aws_lambda_powertools/event_handler/openapi/constants.py
index f5d72d47f7e..debe1d56736 100644
--- a/aws_lambda_powertools/event_handler/openapi/constants.py
+++ b/aws_lambda_powertools/event_handler/openapi/constants.py
@@ -1,2 +1,3 @@
DEFAULT_API_VERSION = "1.0.0"
DEFAULT_OPENAPI_VERSION = "3.1.0"
+DEFAULT_OPENAPI_TITLE = "Powertools for AWS Lambda (Python) API"
diff --git a/aws_lambda_powertools/event_handler/openapi/exceptions.py b/aws_lambda_powertools/event_handler/openapi/exceptions.py
index e1ed33e67fd..046a270cdf7 100644
--- a/aws_lambda_powertools/event_handler/openapi/exceptions.py
+++ b/aws_lambda_powertools/event_handler/openapi/exceptions.py
@@ -23,6 +23,16 @@ def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None:
self.body = body
+class ResponseValidationError(ValidationException):
+ """
+ Raised when the response body does not match the OpenAPI schema
+ """
+
+ def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None:
+ super().__init__(errors)
+ self.body = body
+
+
class SerializationError(Exception):
"""
Base exception for all encoding errors
diff --git a/aws_lambda_powertools/event_handler/vpc_lattice.py b/aws_lambda_powertools/event_handler/vpc_lattice.py
index f145c4342e8..30ee8fd86fc 100644
--- a/aws_lambda_powertools/event_handler/vpc_lattice.py
+++ b/aws_lambda_powertools/event_handler/vpc_lattice.py
@@ -8,6 +8,8 @@
)
if TYPE_CHECKING:
+ from http import HTTPStatus
+
from aws_lambda_powertools.event_handler import CORSConfig
from aws_lambda_powertools.utilities.data_classes import VPCLatticeEvent, VPCLatticeEventV2
@@ -53,9 +55,18 @@ def __init__(
serializer: Callable[[dict], str] | None = None,
strip_prefixes: list[str | Pattern] | None = None,
enable_validation: bool = False,
+ response_validation_error_http_code: HTTPStatus | int | None = None,
):
"""Amazon VPC Lattice resolver"""
- super().__init__(ProxyEventType.VPCLatticeEvent, cors, debug, serializer, strip_prefixes, enable_validation)
+ super().__init__(
+ ProxyEventType.VPCLatticeEvent,
+ cors,
+ debug,
+ serializer,
+ strip_prefixes,
+ enable_validation,
+ response_validation_error_http_code,
+ )
def _get_base_path(self) -> str:
return ""
@@ -102,9 +113,18 @@ def __init__(
serializer: Callable[[dict], str] | None = None,
strip_prefixes: list[str | Pattern] | None = None,
enable_validation: bool = False,
+ response_validation_error_http_code: HTTPStatus | int | None = None,
):
"""Amazon VPC Lattice resolver"""
- super().__init__(ProxyEventType.VPCLatticeEventV2, cors, debug, serializer, strip_prefixes, enable_validation)
+ super().__init__(
+ ProxyEventType.VPCLatticeEventV2,
+ cors,
+ debug,
+ serializer,
+ strip_prefixes,
+ enable_validation,
+ response_validation_error_http_code,
+ )
def _get_base_path(self) -> str:
return ""
diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py
index 58b3c50ca3e..cb190030432 100644
--- a/aws_lambda_powertools/logging/logger.py
+++ b/aws_lambda_powertools/logging/logger.py
@@ -64,14 +64,22 @@ def _is_cold_start() -> bool:
bool
cold start bool value
"""
- cold_start = False
-
global is_cold_start
- if is_cold_start:
- cold_start = is_cold_start
+
+ initialization_type = os.getenv(constants.LAMBDA_INITIALIZATION_TYPE)
+
+ # Check for Provisioned Concurrency environment
+ # AWS_LAMBDA_INITIALIZATION_TYPE is set when using Provisioned Concurrency
+ if initialization_type == "provisioned-concurrency":
is_cold_start = False
+ return False
- return cold_start
+ if not is_cold_start:
+ return False
+
+ # This is a cold start - flip the flag and return True
+ is_cold_start = False
+ return True
class Logger:
@@ -1127,6 +1135,12 @@ def _add_log_record_to_buffer(
tracer_id = get_tracer_id()
if tracer_id and self._buffer_config:
+ if not self._buffer_cache.get(tracer_id):
+ # Detect new Lambda invocation context and reset buffer to maintain log isolation
+ # Ensures logs from previous invocations do not leak into current execution
+ # Prevent memory excessive usage
+ self._buffer_cache.clear()
+
log_record: dict[str, Any] = _create_buffer_record(
level=level,
msg=msg,
diff --git a/aws_lambda_powertools/metrics/functions.py b/aws_lambda_powertools/metrics/functions.py
index 75bf0855e18..c155ed9acac 100644
--- a/aws_lambda_powertools/metrics/functions.py
+++ b/aws_lambda_powertools/metrics/functions.py
@@ -2,6 +2,7 @@
import os
from datetime import datetime
+from typing import TYPE_CHECKING
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.exceptions import (
MetricResolutionError,
@@ -11,6 +12,9 @@
from aws_lambda_powertools.shared import constants
from aws_lambda_powertools.shared.functions import strtobool
+if TYPE_CHECKING:
+ from aws_lambda_powertools.utilities.typing.lambda_context import LambdaContext
+
def extract_cloudwatch_metric_resolution_value(metric_resolutions: list, resolution: int | MetricResolution) -> int:
"""Return metric value from CloudWatch metric unit whether that's str or MetricResolution enum
@@ -161,3 +165,37 @@ def is_metrics_disabled() -> bool:
]
return any(disable_conditions)
+
+
+def resolve_cold_start_function_name(function_name: str | None, context: LambdaContext) -> str:
+ """
+ Resolve the function name for ColdStart metrics with a prioritized approach.
+
+ Parameters
+ ----------
+ function_name : str, optional
+ Explicitly provided function name (highest priority).
+ context : LambdaContext
+ AWS Lambda context object.
+
+ Returns
+ -------
+ str
+ Resolved function name.
+
+ Notes
+ -----
+ Function name resolution follows this priority:
+ 1. Explicitly provided function_name
+ 2. Environment variable POWERTOOLS_METRICS_FUNCTION_NAME
+ 3. Lambda context function name
+ """
+
+ if function_name:
+ return function_name
+
+ metrics_function_name_env = os.getenv(constants.METRICS_FUNCTION_NAME_ENV)
+ if metrics_function_name_env:
+ return metrics_function_name_env
+
+ return context.function_name
diff --git a/aws_lambda_powertools/metrics/metrics.py b/aws_lambda_powertools/metrics/metrics.py
index a6493f25516..f81484f2ec6 100644
--- a/aws_lambda_powertools/metrics/metrics.py
+++ b/aws_lambda_powertools/metrics/metrics.py
@@ -86,6 +86,7 @@ def __init__(
service: str | None = None,
namespace: str | None = None,
provider: AmazonCloudWatchEMFProvider | None = None,
+ function_name: str | None = None,
):
self.metric_set = self._metrics
self.metadata_set = self._metadata
@@ -102,6 +103,7 @@ def __init__(
dimension_set=self.dimension_set,
metadata_set=self.metadata_set,
default_dimensions=self._default_dimensions,
+ function_name=function_name,
)
else:
self.provider = provider
diff --git a/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py b/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py
index 65c5b619f57..5b79d55ab2b 100644
--- a/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py
+++ b/aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py
@@ -16,6 +16,7 @@
extract_cloudwatch_metric_resolution_value,
extract_cloudwatch_metric_unit_value,
is_metrics_disabled,
+ resolve_cold_start_function_name,
validate_emf_timestamp,
)
from aws_lambda_powertools.metrics.provider.base import BaseProvider
@@ -51,6 +52,10 @@ class AmazonCloudWatchEMFProvider(BaseProvider):
metric namespace to be set for all metrics
POWERTOOLS_SERVICE_NAME : str
service name used for default dimension
+ POWERTOOLS_METRICS_FUNCTION_NAME: str
+ function name used as dimension for the ColdStart metric
+ POWERTOOLS_METRICS_DISABLED: bool
+ disables all metrics emitted by Powertools
Raises
------
@@ -72,12 +77,14 @@ def __init__(
metadata_set: dict[str, Any] | None = None,
service: str | None = None,
default_dimensions: dict[str, Any] | None = None,
+ function_name: str | None = None,
):
self.metric_set = metric_set if metric_set is not None else {}
self.dimension_set = dimension_set if dimension_set is not None else {}
self.default_dimensions = default_dimensions or {}
self.namespace = resolve_env_var_choice(choice=namespace, env=os.getenv(constants.METRICS_NAMESPACE_ENV))
self.service = resolve_env_var_choice(choice=service, env=os.getenv(constants.SERVICE_NAME_ENV))
+ self.function_name = function_name
self.metadata_set = metadata_set if metadata_set is not None else {}
self.timestamp: int | None = None
@@ -445,9 +452,11 @@ def add_cold_start_metric(self, context: LambdaContext) -> None:
context : Any
Lambda context
"""
+
+ cold_start_function_name = resolve_cold_start_function_name(function_name=self.function_name, context=context)
logger.debug("Adding cold start metric and function_name dimension")
with single_metric(name="ColdStart", unit=MetricUnit.Count, value=1, namespace=self.namespace) as metric:
- metric.add_dimension(name="function_name", value=context.function_name)
+ metric.add_dimension(name="function_name", value=cold_start_function_name)
if self.service:
metric.add_dimension(name="service", value=str(self.service))
diff --git a/aws_lambda_powertools/metrics/provider/cold_start.py b/aws_lambda_powertools/metrics/provider/cold_start.py
index c6ef67bd787..4d3aeeefd45 100644
--- a/aws_lambda_powertools/metrics/provider/cold_start.py
+++ b/aws_lambda_powertools/metrics/provider/cold_start.py
@@ -1,7 +1,18 @@
from __future__ import annotations
+import os
+
+from aws_lambda_powertools.shared import constants
+
is_cold_start = True
+initialization_type = os.getenv(constants.LAMBDA_INITIALIZATION_TYPE)
+
+# Check for Provisioned Concurrency environment
+# AWS_LAMBDA_INITIALIZATION_TYPE is set when using Provisioned Concurrency
+if initialization_type == "provisioned-concurrency":
+ is_cold_start = False
+
def reset_cold_start_flag():
global is_cold_start
diff --git a/aws_lambda_powertools/metrics/provider/datadog/datadog.py b/aws_lambda_powertools/metrics/provider/datadog/datadog.py
index 3e88523df38..ca6fca8a69a 100644
--- a/aws_lambda_powertools/metrics/provider/datadog/datadog.py
+++ b/aws_lambda_powertools/metrics/provider/datadog/datadog.py
@@ -10,11 +10,11 @@
from typing import TYPE_CHECKING, Any
from aws_lambda_powertools.metrics.exceptions import MetricValueError, SchemaValidationError
-from aws_lambda_powertools.metrics.functions import is_metrics_disabled
+from aws_lambda_powertools.metrics.functions import is_metrics_disabled, resolve_cold_start_function_name
from aws_lambda_powertools.metrics.provider import BaseProvider
from aws_lambda_powertools.metrics.provider.datadog.warnings import DatadogDataValidationWarning
from aws_lambda_powertools.shared import constants
-from aws_lambda_powertools.shared.functions import resolve_env_var_choice
+from aws_lambda_powertools.shared.functions import resolve_env_var_choice, strtobool
if TYPE_CHECKING:
from aws_lambda_powertools.shared.types import AnyCallableT
@@ -58,14 +58,19 @@ def __init__(
namespace: str | None = None,
flush_to_log: bool | None = None,
default_tags: dict[str, Any] | None = None,
+ function_name: str | None = None,
):
self.metric_set = metric_set if metric_set is not None else []
+ self.function_name = function_name
self.namespace = (
resolve_env_var_choice(choice=namespace, env=os.getenv(constants.METRICS_NAMESPACE_ENV))
or DEFAULT_NAMESPACE
)
self.default_tags = default_tags or {}
self.flush_to_log = resolve_env_var_choice(choice=flush_to_log, env=os.getenv(constants.DATADOG_FLUSH_TO_LOG))
+ # When set as env var, the value is a string
+ if isinstance(self.flush_to_log, str):
+ self.flush_to_log = strtobool(self.flush_to_log)
# adding name,value,timestamp,tags
def add_metric(
@@ -221,8 +226,11 @@ def add_cold_start_metric(self, context: LambdaContext) -> None:
context : Any
Lambda context
"""
+
+ cold_start_function_name = resolve_cold_start_function_name(function_name=self.function_name, context=context)
+
logger.debug("Adding cold start metric and function_name tagging")
- self.add_metric(name="ColdStart", value=1, function_name=context.function_name)
+ self.add_metric(name="ColdStart", value=1, function_name=cold_start_function_name)
def log_metrics(
self,
diff --git a/aws_lambda_powertools/shared/constants.py b/aws_lambda_powertools/shared/constants.py
index 199f37d99bb..a68b59a7c0c 100644
--- a/aws_lambda_powertools/shared/constants.py
+++ b/aws_lambda_powertools/shared/constants.py
@@ -41,6 +41,7 @@
DATADOG_FLUSH_TO_LOG: str = "DD_FLUSH_TO_LOG"
SERVICE_NAME_ENV: str = "POWERTOOLS_SERVICE_NAME"
METRICS_DISABLED_ENV: str = "POWERTOOLS_METRICS_DISABLED"
+METRICS_FUNCTION_NAME_ENV: str = "POWERTOOLS_METRICS_FUNCTION_NAME"
# If the timestamp of log event is more than 2 hours in future, the log event is skipped.
# If the timestamp of log event is more than 14 days in past, the log event is skipped.
# See https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html
@@ -56,6 +57,7 @@
SAM_LOCAL_ENV: str = "AWS_SAM_LOCAL"
CHALICE_LOCAL_ENV: str = "AWS_CHALICE_CLI_MODE"
LAMBDA_FUNCTION_NAME_ENV: str = "AWS_LAMBDA_FUNCTION_NAME"
+LAMBDA_INITIALIZATION_TYPE: str = "AWS_LAMBDA_INITIALIZATION_TYPE"
# Debug constants
POWERTOOLS_DEV_ENV: str = "POWERTOOLS_DEV"
diff --git a/aws_lambda_powertools/shared/version.py b/aws_lambda_powertools/shared/version.py
index 256fd734482..1f7a1084dcd 100644
--- a/aws_lambda_powertools/shared/version.py
+++ b/aws_lambda_powertools/shared/version.py
@@ -1,3 +1,3 @@
"""Exposes version constant to avoid circular dependencies."""
-VERSION = "3.7.1a7"
+VERSION = "3.9.0"
diff --git a/aws_lambda_powertools/tracing/tracer.py b/aws_lambda_powertools/tracing/tracer.py
index f49fa7bfdbc..503a8e71141 100644
--- a/aws_lambda_powertools/tracing/tracer.py
+++ b/aws_lambda_powertools/tracing/tracer.py
@@ -30,6 +30,32 @@
T = TypeVar("T")
+def _is_cold_start() -> bool:
+ """Verifies whether is cold start
+
+ Returns
+ -------
+ bool
+ cold start bool value
+ """
+ global is_cold_start
+
+ initialization_type = os.getenv(constants.LAMBDA_INITIALIZATION_TYPE)
+
+ # Check for Provisioned Concurrency environment
+ # AWS_LAMBDA_INITIALIZATION_TYPE is set when using Provisioned Concurrency
+ if initialization_type == "provisioned-concurrency":
+ is_cold_start = False
+ return False
+
+ if not is_cold_start:
+ return False
+
+ # This is a cold start - flip the flag and return True
+ is_cold_start = False
+ return True
+
+
class Tracer:
"""Tracer using AWS-XRay to provide decorators with known defaults for Lambda functions
@@ -340,12 +366,9 @@ def decorate(event, context, **kwargs):
raise
finally:
- global is_cold_start
+ cold_start = _is_cold_start()
logger.debug("Annotating cold start")
- subsegment.put_annotation(key="ColdStart", value=is_cold_start)
-
- if is_cold_start:
- is_cold_start = False
+ subsegment.put_annotation(key="ColdStart", value=cold_start)
if self.service:
subsegment.put_annotation(key="Service", value=self.service)
diff --git a/aws_lambda_powertools/utilities/data_classes/__init__.py b/aws_lambda_powertools/utilities/data_classes/__init__.py
index 8d20de7d192..2757725dc62 100644
--- a/aws_lambda_powertools/utilities/data_classes/__init__.py
+++ b/aws_lambda_powertools/utilities/data_classes/__init__.py
@@ -4,6 +4,7 @@
from .alb_event import ALBEvent
from .api_gateway_proxy_event import APIGatewayProxyEvent, APIGatewayProxyEventV2
+from .api_gateway_websocket_event import APIGatewayWebSocketEvent
from .appsync_resolver_event import AppSyncResolverEvent
from .aws_config_rule_event import AWSConfigRuleEvent
from .bedrock_agent_event import BedrockAgentEvent
@@ -51,6 +52,7 @@
__all__ = [
"APIGatewayProxyEvent",
"APIGatewayProxyEventV2",
+ "APIGatewayWebSocketEvent",
"SecretsManagerEvent",
"AppSyncResolverEvent",
"ALBEvent",
diff --git a/aws_lambda_powertools/utilities/data_classes/alb_event.py b/aws_lambda_powertools/utilities/data_classes/alb_event.py
index 1e403d6f692..50505ca6628 100644
--- a/aws_lambda_powertools/utilities/data_classes/alb_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/alb_event.py
@@ -18,7 +18,7 @@ class ALBEventRequestContext(DictWrapper):
@property
def elb_target_group_arn(self) -> str:
"""Target group arn for your Lambda function"""
- return self["requestContext"]["elb"]["targetGroupArn"]
+ return self["elb"]["targetGroupArn"]
class ALBEvent(BaseProxyEvent):
@@ -32,11 +32,7 @@ class ALBEvent(BaseProxyEvent):
@property
def request_context(self) -> ALBEventRequestContext:
- return ALBEventRequestContext(self._data)
-
- @property
- def multi_value_query_string_parameters(self) -> dict[str, list[str]]:
- return self.get("multiValueQueryStringParameters") or {}
+ return ALBEventRequestContext(self["requestContext"])
@property
def resolved_query_string_parameters(self) -> dict[str, list[str]]:
diff --git a/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py b/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py
index f77cb467996..e9b77209860 100644
--- a/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/api_gateway_authorizer_event.py
@@ -183,7 +183,7 @@ def stage_variables(self) -> dict[str, str]:
@property
def request_context(self) -> BaseRequestContext:
- return BaseRequestContext(self._data)
+ return BaseRequestContext(self["requestContext"])
@overload
def get_header_value(
@@ -306,7 +306,7 @@ def query_string_parameters(self) -> dict[str, str]:
@property
def request_context(self) -> BaseRequestContextV2:
- return BaseRequestContextV2(self._data)
+ return BaseRequestContextV2(self["requestContext"])
@property
def path_parameters(self) -> dict[str, str]:
diff --git a/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py b/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py
index f173742fff3..540e86a5c51 100644
--- a/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/api_gateway_proxy_event.py
@@ -61,42 +61,41 @@ class APIGatewayEventRequestContext(BaseRequestContext):
@property
def connected_at(self) -> int | None:
"""The Epoch-formatted connection time. (WebSocket API)"""
- return self["requestContext"].get("connectedAt")
+ return self.get("connectedAt")
@property
def connection_id(self) -> str | None:
"""A unique ID for the connection that can be used to make a callback to the client. (WebSocket API)"""
- return self["requestContext"].get("connectionId")
+ return self.get("connectionId")
@property
def event_type(self) -> str | None:
"""The event type: `CONNECT`, `MESSAGE`, or `DISCONNECT`. (WebSocket API)"""
- return self["requestContext"].get("eventType")
+ return self.get("eventType")
@property
def message_direction(self) -> str | None:
"""Message direction (WebSocket API)"""
- return self["requestContext"].get("messageDirection")
+ return self.get("messageDirection")
@property
def message_id(self) -> str | None:
"""A unique server-side ID for a message. Available only when the `eventType` is `MESSAGE`."""
- return self["requestContext"].get("messageId")
+ return self.get("messageId")
@property
def operation_name(self) -> str | None:
"""The name of the operation being performed"""
- return self["requestContext"].get("operationName")
+ return self.get("operationName")
@property
def route_key(self) -> str | None:
"""The selected route key."""
- return self["requestContext"].get("routeKey")
+ return self.get("routeKey")
@property
def authorizer(self) -> APIGatewayEventAuthorizer:
- authz_data = self._data.get("requestContext", {}).get("authorizer", {})
- return APIGatewayEventAuthorizer(authz_data)
+ return APIGatewayEventAuthorizer(self.get("authorizer") or {})
class APIGatewayProxyEvent(BaseProxyEvent):
@@ -119,16 +118,9 @@ def resource(self) -> str:
def multi_value_headers(self) -> dict[str, list[str]]:
return CaseInsensitiveDict(self.get("multiValueHeaders"))
- @property
- def multi_value_query_string_parameters(self) -> dict[str, list[str]]:
- return self.get("multiValueQueryStringParameters") or {} # key might exist but can be `null`
-
@property
def resolved_query_string_parameters(self) -> dict[str, list[str]]:
- if self.multi_value_query_string_parameters:
- return self.multi_value_query_string_parameters
-
- return super().resolved_query_string_parameters
+ return self.multi_value_query_string_parameters or super().resolved_query_string_parameters
@property
def resolved_headers_field(self) -> dict[str, Any]:
@@ -136,7 +128,7 @@ def resolved_headers_field(self) -> dict[str, Any]:
@property
def request_context(self) -> APIGatewayEventRequestContext:
- return APIGatewayEventRequestContext(self._data)
+ return APIGatewayEventRequestContext(self["requestContext"])
@property
def path_parameters(self) -> dict[str, str]:
@@ -248,8 +240,7 @@ def iam(self) -> RequestContextV2AuthorizerIam:
class RequestContextV2(BaseRequestContextV2):
@property
def authorizer(self) -> RequestContextV2Authorizer:
- ctx = self.get("requestContext") or {} # key might exist but can be `null`
- return RequestContextV2Authorizer(ctx.get("authorizer", {}))
+ return RequestContextV2Authorizer(self.get("authorizer") or {})
class APIGatewayProxyEventV2(BaseProxyEvent):
@@ -291,7 +282,7 @@ def cookies(self) -> list[str]:
@property
def request_context(self) -> RequestContextV2:
- return RequestContextV2(self._data)
+ return RequestContextV2(self["requestContext"])
@property
def path_parameters(self) -> dict[str, str]:
diff --git a/aws_lambda_powertools/utilities/data_classes/api_gateway_websocket_event.py b/aws_lambda_powertools/utilities/data_classes/api_gateway_websocket_event.py
new file mode 100644
index 00000000000..f71e236f874
--- /dev/null
+++ b/aws_lambda_powertools/utilities/data_classes/api_gateway_websocket_event.py
@@ -0,0 +1,128 @@
+from __future__ import annotations
+
+import base64
+from functools import cached_property
+from typing import Any
+
+from aws_lambda_powertools.utilities.data_classes.common import (
+ CaseInsensitiveDict,
+ DictWrapper,
+)
+
+
+class APIGatewayWebSocketEventIdentity(DictWrapper):
+ @property
+ def source_ip(self) -> str:
+ return self["sourceIp"]
+
+ @property
+ def user_agent(self) -> str | None:
+ return self.get("userAgent")
+
+
+class APIGatewayWebSocketEventRequestContext(DictWrapper):
+ @property
+ def route_key(self) -> str:
+ return self["routeKey"]
+
+ @property
+ def disconnect_status_code(self) -> int | None:
+ return self.get("disconnectStatusCode")
+
+ @property
+ def message_id(self) -> str | None:
+ return self.get("messageId")
+
+ @property
+ def event_type(self) -> str:
+ return self["eventType"]
+
+ @property
+ def extended_request_id(self) -> str:
+ return self["extendedRequestId"]
+
+ @property
+ def request_time(self) -> str:
+ return self["requestTime"]
+
+ @property
+ def message_direction(self) -> str:
+ return self["messageDirection"]
+
+ @property
+ def disconnect_reason(self) -> str | None:
+ return self.get("disconnectReason")
+
+ @property
+ def stage(self) -> str:
+ return self["stage"]
+
+ @property
+ def connected_at(self) -> int:
+ return self["connectedAt"]
+
+ @property
+ def request_time_epoch(self) -> int:
+ return self["requestTimeEpoch"]
+
+ @property
+ def identity(self) -> APIGatewayWebSocketEventIdentity:
+ return APIGatewayWebSocketEventIdentity(self["identity"])
+
+ @property
+ def request_id(self) -> str:
+ return self["requestId"]
+
+ @property
+ def domain_name(self) -> str:
+ return self["domainName"]
+
+ @property
+ def connection_id(self) -> str:
+ return self["connectionId"]
+
+ @property
+ def api_id(self) -> str:
+ return self["apiId"]
+
+
+class APIGatewayWebSocketEvent(DictWrapper):
+ """AWS proxy integration event for WebSocket API
+
+ Documentation:
+ --------------
+ - https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-integration-requests.html
+ """
+
+ @property
+ def is_base64_encoded(self) -> bool:
+ return self["isBase64Encoded"]
+
+ @property
+ def body(self) -> str | None:
+ return self.get("body")
+
+ @cached_property
+ def decoded_body(self) -> str | None:
+ body = self.body
+ if self.is_base64_encoded and body:
+ return base64.b64decode(body.encode()).decode()
+ return body
+
+ @cached_property
+ def json_body(self) -> Any:
+ if self.decoded_body:
+ return self._json_deserializer(self.decoded_body)
+ return None
+
+ @property
+ def headers(self) -> dict[str, str]:
+ return CaseInsensitiveDict(self.get("headers"))
+
+ @property
+ def multi_value_headers(self) -> dict[str, list[str]]:
+ return CaseInsensitiveDict(self.get("multiValueHeaders"))
+
+ @property
+ def request_context(self) -> APIGatewayWebSocketEventRequestContext:
+ return APIGatewayWebSocketEventRequestContext(self["requestContext"])
diff --git a/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py b/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py
index a111084b306..c8f8c0e9bbf 100644
--- a/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/appsync_authorizer_event.py
@@ -11,32 +11,32 @@ class AppSyncAuthorizerEventRequestContext(DictWrapper):
@property
def api_id(self) -> str:
"""AppSync API ID"""
- return self["requestContext"]["apiId"]
+ return self["apiId"]
@property
def account_id(self) -> str:
"""AWS Account ID"""
- return self["requestContext"]["accountId"]
+ return self["accountId"]
@property
def request_id(self) -> str:
"""Requestt ID"""
- return self["requestContext"]["requestId"]
+ return self["requestId"]
@property
def query_string(self) -> str:
"""GraphQL query string"""
- return self["requestContext"]["queryString"]
+ return self["queryString"]
@property
def operation_name(self) -> str | None:
"""GraphQL operation name, optional"""
- return self["requestContext"].get("operationName")
+ return self.get("operationName")
@property
def variables(self) -> dict:
"""GraphQL variables"""
- return self["requestContext"]["variables"]
+ return self["variables"]
class AppSyncAuthorizerEvent(DictWrapper):
@@ -57,7 +57,7 @@ def authorization_token(self) -> str:
@property
def request_context(self) -> AppSyncAuthorizerEventRequestContext:
"""Request context"""
- return AppSyncAuthorizerEventRequestContext(self._data)
+ return AppSyncAuthorizerEventRequestContext(self["requestContext"])
class AppSyncAuthorizerResponse:
diff --git a/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py b/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py
index 388e556a812..1b3c57be124 100644
--- a/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/bedrock_agent_event.py
@@ -57,6 +57,8 @@ class BedrockAgentEvent(BaseProxyEvent):
See https://docs.aws.amazon.com/bedrock/latest/userguide/agents-create.html
"""
+ # httpMethod is inherited from BaseProxyEvent class.
+
@property
def message_version(self) -> str:
return self["messageVersion"]
@@ -77,10 +79,6 @@ def action_group(self) -> str:
def api_path(self) -> str:
return self["apiPath"]
- @property
- def http_method(self) -> str:
- return self["httpMethod"]
-
@property
def parameters(self) -> list[BedrockAgentProperty]:
parameters = self.get("parameters") or []
diff --git a/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py b/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py
index 0734a98750e..79c43a8b701 100644
--- a/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/cognito_user_pool_event.py
@@ -9,12 +9,12 @@ class CallerContext(DictWrapper):
@property
def aws_sdk_version(self) -> str:
"""The AWS SDK version number."""
- return self["callerContext"]["awsSdkVersion"]
+ return self["awsSdkVersion"]
@property
def client_id(self) -> str:
"""The ID of the client associated with the user pool."""
- return self["callerContext"]["clientId"]
+ return self["clientId"]
class BaseTriggerEvent(DictWrapper):
@@ -53,54 +53,54 @@ def user_name(self) -> str:
@property
def caller_context(self) -> CallerContext:
"""The caller context"""
- return CallerContext(self._data)
+ return CallerContext(self["callerContext"])
class PreSignUpTriggerEventRequest(DictWrapper):
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes. The attribute names are the keys."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def validation_data(self) -> dict[str, str]:
"""One or more name-value pairs containing the validation data in the request to register a user."""
- return self["request"].get("validationData") or {}
+ return self.get("validationData") or {}
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function
that you specify for the pre sign-up trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class PreSignUpTriggerEventResponse(DictWrapper):
@property
def auto_confirm_user(self) -> bool:
- return bool(self["response"]["autoConfirmUser"])
+ return bool(self["autoConfirmUser"])
@auto_confirm_user.setter
def auto_confirm_user(self, value: bool):
"""Set to true to auto-confirm the user, or false otherwise."""
- self["response"]["autoConfirmUser"] = value
+ self._data["autoConfirmUser"] = value
@property
def auto_verify_email(self) -> bool:
- return bool(self["response"]["autoVerifyEmail"])
+ return bool(self["autoVerifyEmail"])
@auto_verify_email.setter
def auto_verify_email(self, value: bool):
"""Set to true to set as verified the email of a user who is signing up, or false otherwise."""
- self["response"]["autoVerifyEmail"] = value
+ self._data["autoVerifyEmail"] = value
@property
def auto_verify_phone(self) -> bool:
- return bool(self["response"]["autoVerifyPhone"])
+ return bool(self["autoVerifyPhone"])
@auto_verify_phone.setter
def auto_verify_phone(self, value: bool):
"""Set to true to set as verified the phone number of a user who is signing up, or false otherwise."""
- self["response"]["autoVerifyPhone"] = value
+ self._data["autoVerifyPhone"] = value
class PreSignUpTriggerEvent(BaseTriggerEvent):
@@ -121,24 +121,24 @@ class PreSignUpTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> PreSignUpTriggerEventRequest:
- return PreSignUpTriggerEventRequest(self._data)
+ return PreSignUpTriggerEventRequest(self["request"])
@property
def response(self) -> PreSignUpTriggerEventResponse:
- return PreSignUpTriggerEventResponse(self._data)
+ return PreSignUpTriggerEventResponse(self["response"])
class PostConfirmationTriggerEventRequest(DictWrapper):
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes. The attribute names are the keys."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function
that you specify for the post confirmation trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class PostConfirmationTriggerEvent(BaseTriggerEvent):
@@ -158,41 +158,41 @@ class PostConfirmationTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> PostConfirmationTriggerEventRequest:
- return PostConfirmationTriggerEventRequest(self._data)
+ return PostConfirmationTriggerEventRequest(self["request"])
class UserMigrationTriggerEventRequest(DictWrapper):
@property
def password(self) -> str:
- return self["request"]["password"]
+ return self["password"]
@property
def validation_data(self) -> dict[str, str]:
"""One or more name-value pairs containing the validation data in the request to register a user."""
- return self["request"].get("validationData") or {}
+ return self.get("validationData") or {}
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function
that you specify for the pre sign-up trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class UserMigrationTriggerEventResponse(DictWrapper):
@property
def user_attributes(self) -> dict[str, str]:
- return self["response"]["userAttributes"]
+ return self["userAttributes"]
@user_attributes.setter
def user_attributes(self, value: dict[str, str]):
"""It must contain one or more name-value pairs representing user attributes to be stored in the
user profile in your user pool. You can include both standard and custom user attributes.
Custom attributes require the custom: prefix to distinguish them from standard attributes."""
- self["response"]["userAttributes"] = value
+ self._data["userAttributes"] = value
@property
def final_user_status(self) -> str | None:
- return self["response"].get("finalUserStatus")
+ return self.get("finalUserStatus")
@final_user_status.setter
def final_user_status(self, value: str):
@@ -202,31 +202,31 @@ def final_user_status(self, value: str):
If this attribute is set to RESET_REQUIRED, the user is required to change his or her password immediately
after migration at the time of sign-in, and your client app needs to handle the PasswordResetRequiredException
during the authentication flow."""
- self["response"]["finalUserStatus"] = value
+ self._data["finalUserStatus"] = value
@property
def message_action(self) -> str | None:
- return self["response"].get("messageAction")
+ return self.get("messageAction")
@message_action.setter
def message_action(self, value: str):
"""This attribute can be set to "SUPPRESS" to suppress the welcome message usually sent by
Amazon Cognito to new users. If this attribute is not returned, the welcome message will be sent."""
- self["response"]["messageAction"] = value
+ self._data["messageAction"] = value
@property
def desired_delivery_mediums(self) -> list[str]:
- return self["response"].get("desiredDeliveryMediums") or []
+ return self.get("desiredDeliveryMediums") or []
@desired_delivery_mediums.setter
def desired_delivery_mediums(self, value: list[str]):
"""This attribute can be set to "EMAIL" to send the welcome message by email, or "SMS" to send the
welcome message by SMS. If this attribute is not returned, the welcome message will be sent by SMS."""
- self["response"]["desiredDeliveryMediums"] = value
+ self._data["desiredDeliveryMediums"] = value
@property
def force_alias_creation(self) -> bool | None:
- return self["response"].get("forceAliasCreation")
+ return self.get("forceAliasCreation")
@force_alias_creation.setter
def force_alias_creation(self, value: bool):
@@ -239,11 +239,11 @@ def force_alias_creation(self, value: bool):
If this attribute is not returned, it is assumed to be "false".
"""
- self["response"]["forceAliasCreation"] = value
+ self._data["forceAliasCreation"] = value
@property
def enable_sms_mfa(self) -> bool | None:
- return self["response"].get("enableSMSMFA")
+ return self.get("enableSMSMFA")
@enable_sms_mfa.setter
def enable_sms_mfa(self, value: bool):
@@ -251,7 +251,7 @@ def enable_sms_mfa(self, value: bool):
authentication (MFA) to sign in. Your user pool must have MFA enabled. Your user's attributes
in the request parameters must include a phone number, or else the migration of that user will fail.
"""
- self["response"]["enableSMSMFA"] = value
+ self._data["enableSMSMFA"] = value
class UserMigrationTriggerEvent(BaseTriggerEvent):
@@ -271,70 +271,70 @@ class UserMigrationTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> UserMigrationTriggerEventRequest:
- return UserMigrationTriggerEventRequest(self._data)
+ return UserMigrationTriggerEventRequest(self["request"])
@property
def response(self) -> UserMigrationTriggerEventResponse:
- return UserMigrationTriggerEventResponse(self._data)
+ return UserMigrationTriggerEventResponse(self["response"])
class CustomMessageTriggerEventRequest(DictWrapper):
@property
def code_parameter(self) -> str:
"""A string for you to use as the placeholder for the verification code in the custom message."""
- return self["request"]["codeParameter"]
+ return self["codeParameter"]
@property
def link_parameter(self) -> str:
"""A string for you to use as a placeholder for the verification link in the custom message."""
- return self["request"]["linkParameter"]
+ return self["linkParameter"]
@property
def username_parameter(self) -> str:
"""The username parameter. It is a required request parameter for the admin create user flow."""
- return self["request"]["usernameParameter"]
+ return self["usernameParameter"]
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes. The attribute names are the keys."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function
that you specify for the pre sign-up trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class CustomMessageTriggerEventResponse(DictWrapper):
@property
def sms_message(self) -> str:
- return self["response"]["smsMessage"]
+ return self["smsMessage"]
@sms_message.setter
def sms_message(self, value: str):
"""The custom SMS message to be sent to your users.
Must include the codeParameter value received in the request."""
- self["response"]["smsMessage"] = value
+ self._data["smsMessage"] = value
@property
def email_message(self) -> str:
- return self["response"]["emailMessage"]
+ return self["emailMessage"]
@email_message.setter
def email_message(self, value: str):
"""The custom email message to be sent to your users.
Must include the codeParameter value received in the request."""
- self["response"]["emailMessage"] = value
+ self._data["emailMessage"] = value
@property
def email_subject(self) -> str:
- return self["response"]["emailSubject"]
+ return self["emailSubject"]
@email_subject.setter
def email_subject(self, value: str):
"""The subject line for the custom message."""
- self["response"]["emailSubject"] = value
+ self._data["emailSubject"] = value
class CustomMessageTriggerEvent(BaseTriggerEvent):
@@ -361,28 +361,28 @@ class CustomMessageTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> CustomMessageTriggerEventRequest:
- return CustomMessageTriggerEventRequest(self._data)
+ return CustomMessageTriggerEventRequest(self["request"])
@property
def response(self) -> CustomMessageTriggerEventResponse:
- return CustomMessageTriggerEventResponse(self._data)
+ return CustomMessageTriggerEventResponse(self["response"])
class PreAuthenticationTriggerEventRequest(DictWrapper):
@property
def user_not_found(self) -> bool | None:
"""This boolean is populated when PreventUserExistenceErrors is set to ENABLED for your User Pool client."""
- return self["request"].get("userNotFound")
+ return self.get("userNotFound")
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def validation_data(self) -> dict[str, str]:
"""One or more key-value pairs containing the validation data in the user's sign-in request."""
- return self["request"].get("validationData") or {}
+ return self.get("validationData") or {}
class PreAuthenticationTriggerEvent(BaseTriggerEvent):
@@ -405,7 +405,7 @@ class PreAuthenticationTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> PreAuthenticationTriggerEventRequest:
"""Pre Authentication Request Parameters"""
- return PreAuthenticationTriggerEventRequest(self._data)
+ return PreAuthenticationTriggerEventRequest(self["request"])
class PostAuthenticationTriggerEventRequest(DictWrapper):
@@ -413,18 +413,18 @@ class PostAuthenticationTriggerEventRequest(DictWrapper):
def new_device_used(self) -> bool:
"""This flag indicates if the user has signed in on a new device.
It is set only if the remembered devices value of the user pool is set to `Always` or User `Opt-In`."""
- return self["request"]["newDeviceUsed"]
+ return self["newDeviceUsed"]
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function
that you specify for the post authentication trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class PostAuthenticationTriggerEvent(BaseTriggerEvent):
@@ -447,7 +447,7 @@ class PostAuthenticationTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> PostAuthenticationTriggerEventRequest:
"""Post Authentication Request Parameters"""
- return PostAuthenticationTriggerEventRequest(self._data)
+ return PostAuthenticationTriggerEventRequest(self["request"])
class GroupOverrideDetails(DictWrapper):
@@ -471,18 +471,18 @@ class PreTokenGenerationTriggerEventRequest(DictWrapper):
@property
def group_configuration(self) -> GroupOverrideDetails:
"""The input object containing the current group configuration"""
- return GroupOverrideDetails(self["request"]["groupConfiguration"])
+ return GroupOverrideDetails(self["groupConfiguration"])
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes."""
- return self["request"].get("userAttributes") or {}
+ return self.get("userAttributes") or {}
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function
that you specify for the pre token generation trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class PreTokenGenerationTriggerV2EventRequest(PreTokenGenerationTriggerEventRequest):
@@ -492,10 +492,10 @@ def scopes(self) -> list[str]:
the user pool standard and custom scopes that your user requested,
and that you authorized your app client to issue.
"""
- return self["request"].get("scopes")
+ return self.get("scopes") or []
-class ClaimsOverrideDetails(DictWrapper):
+class ClaimsOverrideBase(DictWrapper):
@property
def claims_to_add_or_override(self) -> dict[str, str]:
return self.get("claimsToAddOrOverride") or {}
@@ -515,6 +515,8 @@ def claims_to_suppress(self, value: list[str]):
"""A list that contains claims to be suppressed from the identity token."""
self._data["claimsToSuppress"] = value
+
+class GroupConfigurationBase(DictWrapper):
@property
def group_configuration(self) -> GroupOverrideDetails | None:
group_override_details = self.get("groupOverrideDetails")
@@ -549,26 +551,11 @@ def set_group_configuration_preferred_role(self, value: str):
self["groupOverrideDetails"]["preferredRole"] = value
-class TokenClaimsAndScopeOverrideDetails(DictWrapper):
- @property
- def claims_to_add_or_override(self) -> dict[str, str]:
- return self.get("claimsToAddOrOverride") or {}
+class ClaimsOverrideDetails(ClaimsOverrideBase, GroupConfigurationBase):
+ pass
- @claims_to_add_or_override.setter
- def claims_to_add_or_override(self, value: dict[str, str]):
- """A map of one or more key-value pairs of claims to add or override.
- For group related claims, use groupOverrideDetails instead."""
- self._data["claimsToAddOrOverride"] = value
-
- @property
- def claims_to_suppress(self) -> list[str]:
- return self.get("claimsToSuppress") or []
-
- @claims_to_suppress.setter
- def claims_to_suppress(self, value: list[str]):
- """A list that contains claims to be suppressed from the identity token."""
- self._data["claimsToSuppress"] = value
+class TokenClaimsAndScopeOverrideDetails(ClaimsOverrideBase):
@property
def scopes_to_add(self) -> list[str]:
return self.get("scopesToAdd") or []
@@ -586,8 +573,7 @@ def scopes_to_suppress(self, value: list[str]):
self._data["scopesToSuppress"] = value
-class ClaimsAndScopeOverrideDetails(DictWrapper):
-
+class ClaimsAndScopeOverrideDetails(GroupConfigurationBase):
@property
def id_token_generation(self) -> TokenClaimsAndScopeOverrideDetails | None:
id_token_generation_details = self._data.get("idTokenGeneration")
@@ -632,56 +618,17 @@ def access_token_generation(self, value: dict[str, Any]):
"""
self._data["accessTokenGeneration"] = value
- @property
- def group_configuration(self) -> GroupOverrideDetails | None:
- group_override_details = self.get("groupOverrideDetails")
- return None if group_override_details is None else GroupOverrideDetails(group_override_details)
-
- @group_configuration.setter
- def group_configuration(self, value: dict[str, Any]):
- """The output object containing the current group configuration.
-
- It includes groupsToOverride, iamRolesToOverride, and preferredRole.
-
- The groupOverrideDetails object is replaced with the one you provide. If you provide an empty or null
- object in the response, then the groups are suppressed. To leave the existing group configuration
- as is, copy the value of the request's groupConfiguration object to the groupOverrideDetails object
- in the response, and pass it back to the service.
- """
- self._data["groupOverrideDetails"] = value
-
- def set_group_configuration_groups_to_override(self, value: list[str]):
- """A list of the group names that are associated with the user that the identity token is issued for."""
- self._data.setdefault("groupOverrideDetails", {})
- self["groupOverrideDetails"]["groupsToOverride"] = value
-
- def set_group_configuration_iam_roles_to_override(self, value: list[str]):
- """A list of the current IAM roles associated with these groups."""
- self._data.setdefault("groupOverrideDetails", {})
- self["groupOverrideDetails"]["iamRolesToOverride"] = value
-
- def set_group_configuration_preferred_role(self, value: str):
- """A string indicating the preferred IAM role."""
- self._data.setdefault("groupOverrideDetails", {})
- self["groupOverrideDetails"]["preferredRole"] = value
-
class PreTokenGenerationTriggerEventResponse(DictWrapper):
@property
def claims_override_details(self) -> ClaimsOverrideDetails:
- # Ensure we have a `claimsOverrideDetails` element and is not set to None
- if self._data["response"].get("claimsOverrideDetails") is None:
- self._data["response"]["claimsOverrideDetails"] = {}
- return ClaimsOverrideDetails(self._data["response"]["claimsOverrideDetails"])
+ return ClaimsOverrideDetails(self.get("claimsOverrideDetails") or {})
class PreTokenGenerationTriggerV2EventResponse(DictWrapper):
@property
def claims_scope_override_details(self) -> ClaimsAndScopeOverrideDetails:
- # Ensure we have a `claimsAndScopeOverrideDetails` element and is not set to None
- if self._data["response"].get("claimsAndScopeOverrideDetails") is None:
- self._data["response"]["claimsAndScopeOverrideDetails"] = {}
- return ClaimsAndScopeOverrideDetails(self._data["response"]["claimsAndScopeOverrideDetails"])
+ return ClaimsAndScopeOverrideDetails(self.get("claimsAndScopeOverrideDetails") or {})
class PreTokenGenerationTriggerEvent(BaseTriggerEvent):
@@ -708,12 +655,12 @@ class PreTokenGenerationTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> PreTokenGenerationTriggerEventRequest:
"""Pre Token Generation Request Parameters"""
- return PreTokenGenerationTriggerEventRequest(self._data)
+ return PreTokenGenerationTriggerEventRequest(self["request"])
@property
def response(self) -> PreTokenGenerationTriggerEventResponse:
"""Pre Token Generation Response Parameters"""
- return PreTokenGenerationTriggerEventResponse(self._data)
+ return PreTokenGenerationTriggerEventResponse(self["response"])
class PreTokenGenerationV2TriggerEvent(BaseTriggerEvent):
@@ -740,12 +687,12 @@ class PreTokenGenerationV2TriggerEvent(BaseTriggerEvent):
@property
def request(self) -> PreTokenGenerationTriggerV2EventRequest:
"""Pre Token Generation Request V2 Parameters"""
- return PreTokenGenerationTriggerV2EventRequest(self._data)
+ return PreTokenGenerationTriggerV2EventRequest(self["request"])
@property
def response(self) -> PreTokenGenerationTriggerV2EventResponse:
"""Pre Token Generation Response V2 Parameters"""
- return PreTokenGenerationTriggerV2EventResponse(self._data)
+ return PreTokenGenerationTriggerV2EventResponse(self["response"])
class ChallengeResult(DictWrapper):
@@ -772,55 +719,55 @@ class DefineAuthChallengeTriggerEventRequest(DictWrapper):
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes. The attribute names are the keys."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def user_not_found(self) -> bool | None:
"""A Boolean that is populated when PreventUserExistenceErrors is set to ENABLED for your user pool client.
A value of true means that the user id (username, email address, etc.) did not match any existing users."""
- return self["request"].get("userNotFound")
+ return self.get("userNotFound")
@property
def session(self) -> list[ChallengeResult]:
"""An array of ChallengeResult elements, each of which contains the following elements:"""
- return [ChallengeResult(result) for result in self["request"]["session"]]
+ return [ChallengeResult(result) for result in self["session"]]
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function that you specify
for the defined auth challenge trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class DefineAuthChallengeTriggerEventResponse(DictWrapper):
@property
def challenge_name(self) -> str:
- return self["response"]["challengeName"]
+ return self["challengeName"]
@challenge_name.setter
def challenge_name(self, value: str):
"""A string containing the name of the next challenge.
If you want to present a new challenge to your user, specify the challenge name here."""
- self["response"]["challengeName"] = value
+ self._data["challengeName"] = value
@property
def fail_authentication(self) -> bool:
- return bool(self["response"]["failAuthentication"])
+ return bool(self["failAuthentication"])
@fail_authentication.setter
def fail_authentication(self, value: bool):
"""Set to true if you want to terminate the current authentication process, or false otherwise."""
- self["response"]["failAuthentication"] = value
+ self._data["failAuthentication"] = value
@property
def issue_tokens(self) -> bool:
- return bool(self["response"]["issueTokens"])
+ return bool(self["issueTokens"])
@issue_tokens.setter
def issue_tokens(self, value: bool):
"""Set to true if you determine that the user has been sufficiently authenticated by
completing the challenges, or false otherwise."""
- self["response"]["issueTokens"] = value
+ self._data["issueTokens"] = value
class DefineAuthChallengeTriggerEvent(BaseTriggerEvent):
@@ -842,57 +789,57 @@ class DefineAuthChallengeTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> DefineAuthChallengeTriggerEventRequest:
"""Define Auth Challenge Request Parameters"""
- return DefineAuthChallengeTriggerEventRequest(self._data)
+ return DefineAuthChallengeTriggerEventRequest(self["request"])
@property
def response(self) -> DefineAuthChallengeTriggerEventResponse:
"""Define Auth Challenge Response Parameters"""
- return DefineAuthChallengeTriggerEventResponse(self._data)
+ return DefineAuthChallengeTriggerEventResponse(self["response"])
class CreateAuthChallengeTriggerEventRequest(DictWrapper):
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes. The attribute names are the keys."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def user_not_found(self) -> bool | None:
"""This boolean is populated when PreventUserExistenceErrors is set to ENABLED for your User Pool client."""
- return self["request"].get("userNotFound")
+ return self.get("userNotFound")
@property
def challenge_name(self) -> str:
"""The name of the new challenge."""
- return self["request"]["challengeName"]
+ return self["challengeName"]
@property
def session(self) -> list[ChallengeResult]:
"""An array of ChallengeResult elements, each of which contains the following elements:"""
- return [ChallengeResult(result) for result in self["request"]["session"]]
+ return [ChallengeResult(result) for result in self["session"]]
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function that you
specify for the creation auth challenge trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class CreateAuthChallengeTriggerEventResponse(DictWrapper):
@property
def public_challenge_parameters(self) -> dict[str, str]:
- return self["response"]["publicChallengeParameters"]
+ return self["publicChallengeParameters"]
@public_challenge_parameters.setter
def public_challenge_parameters(self, value: dict[str, str]):
"""One or more key-value pairs for the client app to use in the challenge to be presented to the user.
This parameter should contain all the necessary information to accurately present the challenge to
the user."""
- self["response"]["publicChallengeParameters"] = value
+ self._data["publicChallengeParameters"] = value
@property
def private_challenge_parameters(self) -> dict[str, str]:
- return self["response"]["privateChallengeParameters"]
+ return self["privateChallengeParameters"]
@private_challenge_parameters.setter
def private_challenge_parameters(self, value: dict[str, str]):
@@ -901,16 +848,16 @@ def private_challenge_parameters(self, value: dict[str, str]):
response to the challenge. In other words, the publicChallengeParameters parameter contains the
question that is presented to the user and privateChallengeParameters contains the valid answers
for the question."""
- self["response"]["privateChallengeParameters"] = value
+ self._data["privateChallengeParameters"] = value
@property
def challenge_metadata(self) -> str:
- return self["response"]["challengeMetadata"]
+ return self["challengeMetadata"]
@challenge_metadata.setter
def challenge_metadata(self, value: str):
"""Your name for the custom challenge, if this is a custom challenge."""
- self["response"]["challengeMetadata"] = value
+ self._data["challengeMetadata"] = value
class CreateAuthChallengeTriggerEvent(BaseTriggerEvent):
@@ -934,52 +881,52 @@ class CreateAuthChallengeTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> CreateAuthChallengeTriggerEventRequest:
"""Create Auth Challenge Request Parameters"""
- return CreateAuthChallengeTriggerEventRequest(self._data)
+ return CreateAuthChallengeTriggerEventRequest(self["request"])
@property
def response(self) -> CreateAuthChallengeTriggerEventResponse:
"""Create Auth Challenge Response Parameters"""
- return CreateAuthChallengeTriggerEventResponse(self._data)
+ return CreateAuthChallengeTriggerEventResponse(self["response"])
class VerifyAuthChallengeResponseTriggerEventRequest(DictWrapper):
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes. The attribute names are the keys."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def private_challenge_parameters(self) -> dict[str, str]:
"""This parameter comes from the Create Auth Challenge trigger, and is
compared against a user’s challengeAnswer to determine whether the user passed the challenge."""
- return self["request"]["privateChallengeParameters"]
+ return self["privateChallengeParameters"]
@property
def challenge_answer(self) -> Any:
"""The answer from the user's response to the challenge."""
- return self["request"]["challengeAnswer"]
+ return self["challengeAnswer"]
@property
def client_metadata(self) -> dict[str, str]:
"""One or more key-value pairs that you can provide as custom input to the Lambda function that
you specify for the "Verify Auth Challenge" trigger."""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
@property
def user_not_found(self) -> bool | None:
"""This boolean is populated when PreventUserExistenceErrors is set to ENABLED for your User Pool client."""
- return self["request"].get("userNotFound")
+ return self.get("userNotFound")
class VerifyAuthChallengeResponseTriggerEventResponse(DictWrapper):
@property
def answer_correct(self) -> bool:
- return bool(self["response"]["answerCorrect"])
+ return bool(self["answerCorrect"])
@answer_correct.setter
def answer_correct(self, value: bool):
"""Set to true if the user has successfully completed the challenge, or false otherwise."""
- self["response"]["answerCorrect"] = value
+ self._data["answerCorrect"] = value
class VerifyAuthChallengeResponseTriggerEvent(BaseTriggerEvent):
@@ -1003,12 +950,12 @@ class VerifyAuthChallengeResponseTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> VerifyAuthChallengeResponseTriggerEventRequest:
"""Verify Auth Challenge Request Parameters"""
- return VerifyAuthChallengeResponseTriggerEventRequest(self._data)
+ return VerifyAuthChallengeResponseTriggerEventRequest(self["request"])
@property
def response(self) -> VerifyAuthChallengeResponseTriggerEventResponse:
"""Verify Auth Challenge Response Parameters"""
- return VerifyAuthChallengeResponseTriggerEventResponse(self._data)
+ return VerifyAuthChallengeResponseTriggerEventResponse(self["response"])
class CustomEmailSenderTriggerEventRequest(DictWrapper):
@@ -1017,17 +964,17 @@ def type(self) -> str:
"""The request version. For a custom email sender event, the value of this string
is always customEmailSenderRequestV1.
"""
- return self["request"]["type"]
+ return self["type"]
@property
def code(self) -> str:
"""The encrypted code that your function can decrypt and send to your user."""
- return self["request"]["code"]
+ return self["code"]
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes. The attribute names are the keys."""
- return self["request"]["userAttributes"]
+ return self["userAttributes"]
@property
def client_metadata(self) -> dict[str, str]:
@@ -1038,14 +985,14 @@ def client_metadata(self) -> dict[str, str]:
ClientMetadata parameter in AdminInitiateAuth and InitiateAuth API operations
in the request that it passes to the post authentication function.
"""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class CustomEmailSenderTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> CustomEmailSenderTriggerEventRequest:
"""Custom Email Sender Request Parameters"""
- return CustomEmailSenderTriggerEventRequest(self._data)
+ return CustomEmailSenderTriggerEventRequest(self["request"])
class CustomSMSSenderTriggerEventRequest(DictWrapper):
@@ -1054,17 +1001,17 @@ def type(self) -> str:
"""The request version. For a custom SMS sender event, the value of this string is always
customSMSSenderRequestV1.
"""
- return self["request"]["type"]
+ return self["type"]
@property
def code(self) -> str:
"""The encrypted code that your function can decrypt and send to your user."""
- return self["request"]["code"]
+ return self["code"]
@property
def user_attributes(self) -> dict[str, str]:
"""One or more name-value pairs representing user attributes. The attribute names are the keys."""
- return self["request"].get("userAttributes") or {}
+ return self.get("userAttributes") or {}
@property
def client_metadata(self) -> dict[str, str]:
@@ -1075,11 +1022,11 @@ def client_metadata(self) -> dict[str, str]:
ClientMetadata parameter in AdminInitiateAuth and InitiateAuth API operations
in the request that it passes to the post authentication function.
"""
- return self["request"].get("clientMetadata") or {}
+ return self.get("clientMetadata") or {}
class CustomSMSSenderTriggerEvent(BaseTriggerEvent):
@property
def request(self) -> CustomSMSSenderTriggerEventRequest:
"""Custom SMS Sender Request Parameters"""
- return CustomSMSSenderTriggerEventRequest(self._data)
+ return CustomSMSSenderTriggerEventRequest(self["request"])
diff --git a/aws_lambda_powertools/utilities/data_classes/common.py b/aws_lambda_powertools/utilities/data_classes/common.py
index 8374bf5ee08..5af24c27a13 100644
--- a/aws_lambda_powertools/utilities/data_classes/common.py
+++ b/aws_lambda_powertools/utilities/data_classes/common.py
@@ -205,7 +205,6 @@ def json_body(self) -> Any:
"""Parses the submitted body as json"""
if self.decoded_body:
return self._json_deserializer(self.decoded_body)
-
return None
@cached_property
@@ -370,81 +369,81 @@ def validity_not_before(self) -> str:
class APIGatewayEventIdentity(DictWrapper):
@property
def access_key(self) -> str | None:
- return self["requestContext"]["identity"].get("accessKey")
+ return self.get("accessKey")
@property
def account_id(self) -> str | None:
"""The AWS account ID associated with the request."""
- return self["requestContext"]["identity"].get("accountId")
+ return self.get("accountId")
@property
def api_key(self) -> str | None:
"""For API methods that require an API key, this variable is the API key associated with the method request.
For methods that don't require an API key, this variable is null."""
- return self["requestContext"]["identity"].get("apiKey")
+ return self.get("apiKey")
@property
def api_key_id(self) -> str | None:
"""The API key ID associated with an API request that requires an API key."""
- return self["requestContext"]["identity"].get("apiKeyId")
+ return self.get("apiKeyId")
@property
def caller(self) -> str | None:
"""The principal identifier of the caller making the request."""
- return self["requestContext"]["identity"].get("caller")
+ return self.get("caller")
@property
def cognito_authentication_provider(self) -> str | None:
"""A comma-separated list of the Amazon Cognito authentication providers used by the caller
making the request. Available only if the request was signed with Amazon Cognito credentials."""
- return self["requestContext"]["identity"].get("cognitoAuthenticationProvider")
+ return self.get("cognitoAuthenticationProvider")
@property
def cognito_authentication_type(self) -> str | None:
"""The Amazon Cognito authentication type of the caller making the request.
Available only if the request was signed with Amazon Cognito credentials."""
- return self["requestContext"]["identity"].get("cognitoAuthenticationType")
+ return self.get("cognitoAuthenticationType")
@property
def cognito_identity_id(self) -> str | None:
"""The Amazon Cognito identity ID of the caller making the request.
Available only if the request was signed with Amazon Cognito credentials."""
- return self["requestContext"]["identity"].get("cognitoIdentityId")
+ return self.get("cognitoIdentityId")
@property
def cognito_identity_pool_id(self) -> str | None:
"""The Amazon Cognito identity pool ID of the caller making the request.
Available only if the request was signed with Amazon Cognito credentials."""
- return self["requestContext"]["identity"].get("cognitoIdentityPoolId")
+ return self.get("cognitoIdentityPoolId")
@property
def principal_org_id(self) -> str | None:
"""The AWS organization ID."""
- return self["requestContext"]["identity"].get("principalOrgId")
+ return self.get("principalOrgId")
@property
def source_ip(self) -> str:
"""The source IP address of the TCP connection making the request to API Gateway."""
- return self["requestContext"]["identity"]["sourceIp"]
+ return self["sourceIp"]
@property
def user(self) -> str | None:
"""The principal identifier of the user making the request."""
- return self["requestContext"]["identity"].get("user")
+ return self.get("user")
@property
def user_agent(self) -> str | None:
"""The User Agent of the API caller."""
- return self["requestContext"]["identity"].get("userAgent")
+ return self.get("userAgent")
@property
def user_arn(self) -> str | None:
"""The Amazon Resource Name (ARN) of the effective user identified after authentication."""
- return self["requestContext"]["identity"].get("userArn")
+ return self.get("userArn")
@property
def client_cert(self) -> RequestContextClientCert | None:
- client_cert = self["requestContext"]["identity"].get("clientCert")
+ client_cert = self.get("clientCert")
return None if client_cert is None else RequestContextClientCert(client_cert)
@@ -452,153 +451,153 @@ class BaseRequestContext(DictWrapper):
@property
def account_id(self) -> str:
"""The AWS account ID associated with the request."""
- return self["requestContext"]["accountId"]
+ return self["accountId"]
@property
def api_id(self) -> str:
"""The identifier API Gateway assigns to your API."""
- return self["requestContext"]["apiId"]
+ return self["apiId"]
@property
def domain_name(self) -> str | None:
"""A domain name"""
- return self["requestContext"].get("domainName")
+ return self.get("domainName")
@property
def domain_prefix(self) -> str | None:
- return self["requestContext"].get("domainPrefix")
+ return self.get("domainPrefix")
@property
def extended_request_id(self) -> str | None:
"""An automatically generated ID for the API call, which contains more useful information
for debugging/troubleshooting."""
- return self["requestContext"].get("extendedRequestId")
+ return self.get("extendedRequestId")
@property
def protocol(self) -> str:
"""The request protocol, for example, HTTP/1.1."""
- return self["requestContext"]["protocol"]
+ return self["protocol"]
@property
def http_method(self) -> str:
"""The HTTP method used. Valid values include: DELETE, GET, HEAD, OPTIONS, PATCH, POST, and PUT."""
- return self["requestContext"]["httpMethod"]
+ return self["httpMethod"]
@property
def identity(self) -> APIGatewayEventIdentity:
- return APIGatewayEventIdentity(self._data)
+ return APIGatewayEventIdentity(self["identity"])
@property
def path(self) -> str:
- return self["requestContext"]["path"]
+ return self["path"]
@property
def stage(self) -> str:
"""The deployment stage of the API request"""
- return self["requestContext"]["stage"]
+ return self["stage"]
@property
def request_id(self) -> str:
"""The ID that API Gateway assigns to the API request."""
- return self["requestContext"]["requestId"]
+ return self["requestId"]
@property
def request_time(self) -> str | None:
"""The CLF-formatted request time (dd/MMM/yyyy:HH:mm:ss +-hhmm)"""
- return self["requestContext"].get("requestTime")
+ return self.get("requestTime")
@property
def request_time_epoch(self) -> int:
"""The Epoch-formatted request time."""
- return self["requestContext"]["requestTimeEpoch"]
+ return self["requestTimeEpoch"]
@property
def resource_id(self) -> str:
- return self["requestContext"]["resourceId"]
+ return self["resourceId"]
@property
def resource_path(self) -> str:
- return self["requestContext"]["resourcePath"]
+ return self["resourcePath"]
class RequestContextV2Http(DictWrapper):
@property
def method(self) -> str:
- return self["requestContext"]["http"]["method"]
+ return self["method"]
@property
def path(self) -> str:
- return self["requestContext"]["http"]["path"]
+ return self["path"]
@property
def protocol(self) -> str:
"""The request protocol, for example, HTTP/1.1."""
- return self["requestContext"]["http"]["protocol"]
+ return self["protocol"]
@property
def source_ip(self) -> str:
"""The source IP address of the TCP connection making the request to API Gateway."""
- return self["requestContext"]["http"]["sourceIp"]
+ return self["sourceIp"]
@property
def user_agent(self) -> str:
"""The User Agent of the API caller."""
- return self["requestContext"]["http"]["userAgent"]
+ return self["userAgent"]
class BaseRequestContextV2(DictWrapper):
@property
def account_id(self) -> str:
"""The AWS account ID associated with the request."""
- return self["requestContext"]["accountId"]
+ return self["accountId"]
@property
def api_id(self) -> str:
"""The identifier API Gateway assigns to your API."""
- return self["requestContext"]["apiId"]
+ return self["apiId"]
@property
def domain_name(self) -> str:
"""A domain name"""
- return self["requestContext"]["domainName"]
+ return self["domainName"]
@property
def domain_prefix(self) -> str:
- return self["requestContext"]["domainPrefix"]
+ return self["domainPrefix"]
@property
def http(self) -> RequestContextV2Http:
- return RequestContextV2Http(self._data)
+ return RequestContextV2Http(self["http"])
@property
def request_id(self) -> str:
"""The ID that API Gateway assigns to the API request."""
- return self["requestContext"]["requestId"]
+ return self["requestId"]
@property
def route_key(self) -> str:
"""The selected route key."""
- return self["requestContext"]["routeKey"]
+ return self["routeKey"]
@property
def stage(self) -> str:
"""The deployment stage of the API request"""
- return self["requestContext"]["stage"]
+ return self["stage"]
@property
def time(self) -> str:
"""The CLF-formatted request time (dd/MMM/yyyy:HH:mm:ss +-hhmm)."""
- return self["requestContext"]["time"]
+ return self["time"]
@property
def time_epoch(self) -> int:
"""The Epoch-formatted request time."""
- return self["requestContext"]["timeEpoch"]
+ return self["timeEpoch"]
@property
def authentication(self) -> RequestContextClientCert | None:
"""Optional when using mutual TLS authentication"""
# FunctionURL might have NONE as AuthZ
- authentication = self["requestContext"].get("authentication") or {}
+ authentication = self.get("authentication") or {}
client_cert = authentication.get("clientCert")
return None if client_cert is None else RequestContextClientCert(client_cert)
diff --git a/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py b/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py
index 85e75e198f6..bc61cd69cf0 100644
--- a/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/kinesis_firehose_event.py
@@ -177,30 +177,25 @@ def asdict(self) -> dict:
class KinesisFirehoseRecordMetadata(DictWrapper):
- @property
- def _metadata(self) -> dict:
- """Optional: metadata associated with this record; present only when Kinesis Stream is source"""
- return self["kinesisRecordMetadata"] # could raise KeyError
-
@property
def shard_id(self) -> str:
"""Kinesis stream shard ID; present only when Kinesis Stream is source"""
- return self._metadata["shardId"]
+ return self["shardId"]
@property
def partition_key(self) -> str:
"""Kinesis stream partition key; present only when Kinesis Stream is source"""
- return self._metadata["partitionKey"]
+ return self["partitionKey"]
@property
def approximate_arrival_timestamp(self) -> int:
"""Kinesis stream approximate arrival ISO timestamp; present only when Kinesis Stream is source"""
- return self._metadata["approximateArrivalTimestamp"]
+ return self["approximateArrivalTimestamp"]
@property
def sequence_number(self) -> str:
"""Kinesis stream sequence number; present only when Kinesis Stream is source"""
- return self._metadata["sequenceNumber"]
+ return self["sequenceNumber"]
@property
def subsequence_number(self) -> int:
@@ -208,7 +203,7 @@ def subsequence_number(self) -> int:
Note: this will only be present for Kinesis streams using record aggregation
"""
- return self._metadata["subsequenceNumber"]
+ return self["subsequenceNumber"]
class KinesisFirehoseRecord(DictWrapper):
@@ -230,7 +225,8 @@ def data(self) -> str:
@property
def metadata(self) -> KinesisFirehoseRecordMetadata | None:
"""Optional: metadata associated with this record; present only when Kinesis Stream is source"""
- return KinesisFirehoseRecordMetadata(self._data) if self.get("kinesisRecordMetadata") else None
+ metadata = self.get("kinesisRecordMetadata")
+ return KinesisFirehoseRecordMetadata(metadata) if metadata else None
@property
def data_as_bytes(self) -> bytes:
diff --git a/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py b/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py
index ba2300b34be..8d6c96c557d 100644
--- a/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/kinesis_stream_event.py
@@ -15,27 +15,27 @@ class KinesisStreamRecordPayload(DictWrapper):
@property
def approximate_arrival_timestamp(self) -> float:
"""The approximate time that the record was inserted into the stream"""
- return float(self["kinesis"]["approximateArrivalTimestamp"])
+ return float(self["approximateArrivalTimestamp"])
@property
def data(self) -> str:
"""The data blob"""
- return self["kinesis"]["data"]
+ return self["data"]
@property
def kinesis_schema_version(self) -> str:
"""Schema version for the record"""
- return self["kinesis"]["kinesisSchemaVersion"]
+ return self["kinesisSchemaVersion"]
@property
def partition_key(self) -> str:
"""Identifies which shard in the stream the data record is assigned to"""
- return self["kinesis"]["partitionKey"]
+ return self["partitionKey"]
@property
def sequence_number(self) -> str:
"""The unique identifier of the record within its shard"""
- return self["kinesis"]["sequenceNumber"]
+ return self["sequenceNumber"]
def data_as_bytes(self) -> bytes:
"""Decode binary encoded data as bytes"""
@@ -94,7 +94,7 @@ def invoke_identity_arn(self) -> str:
@property
def kinesis(self) -> KinesisStreamRecordPayload:
"""Underlying Kinesis record associated with the event"""
- return KinesisStreamRecordPayload(self._data)
+ return KinesisStreamRecordPayload(self["kinesis"])
class KinesisStreamEvent(DictWrapper):
diff --git a/aws_lambda_powertools/utilities/data_classes/s3_event.py b/aws_lambda_powertools/utilities/data_classes/s3_event.py
index f3c0fa2adf9..db5debc8db1 100644
--- a/aws_lambda_powertools/utilities/data_classes/s3_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/s3_event.py
@@ -18,7 +18,7 @@ def principal_id(self) -> str:
class S3RequestParameters(DictWrapper):
@property
def source_ip_address(self) -> str:
- return self["requestParameters"]["sourceIPAddress"]
+ return self["sourceIPAddress"]
class S3EventNotificationEventBridgeBucket(DictWrapper):
@@ -40,8 +40,8 @@ def size(self) -> int | None:
@property
def etag(self) -> str:
- """Object etag. Object deletion event doesn't contain etag; we default to empty string"""
- return self.get("etag", "") # type: ignore[return-value] # false positive
+ """Object eTag. Object deletion event doesn't contain eTag; we default to empty string"""
+ return self.get("etag") or ""
@property
def version_id(self) -> str:
@@ -156,77 +156,77 @@ def detail(self) -> S3EventBridgeNotificationDetail: # type: ignore[override]
class S3Bucket(DictWrapper):
@property
def name(self) -> str:
- return self["s3"]["bucket"]["name"]
+ return self["name"]
@property
def owner_identity(self) -> S3Identity:
- return S3Identity(self["s3"]["bucket"]["ownerIdentity"])
+ return S3Identity(self["ownerIdentity"])
@property
def arn(self) -> str:
- return self["s3"]["bucket"]["arn"]
+ return self["arn"]
class S3Object(DictWrapper):
@property
def key(self) -> str:
"""Object key"""
- return self["s3"]["object"]["key"]
+ return self["key"]
@property
def size(self) -> int:
"""Object byte size"""
- return int(self["s3"]["object"]["size"])
+ return int(self["size"])
@property
def etag(self) -> str:
"""Object eTag. Object deletion event doesn't contain eTag; we default to empty string"""
- return self["s3"]["object"].get("eTag", "")
+ return self.get("eTag") or ""
@property
def version_id(self) -> str | None:
"""Object version if bucket is versioning-enabled, otherwise null"""
- return self["s3"]["object"].get("versionId")
+ return self.get("versionId")
@property
def sequencer(self) -> str:
"""A string representation of a hexadecimal value used to determine event sequence,
only used with PUTs and DELETEs
"""
- return self["s3"]["object"]["sequencer"]
+ return self["sequencer"]
class S3Message(DictWrapper):
@property
def s3_schema_version(self) -> str:
- return self["s3"]["s3SchemaVersion"]
+ return self["s3SchemaVersion"]
@property
def configuration_id(self) -> str:
"""ID found in the bucket notification configuration"""
- return self["s3"]["configurationId"]
+ return self["configurationId"]
@property
def bucket(self) -> S3Bucket:
- return S3Bucket(self._data)
+ return S3Bucket(self["bucket"])
@property
def get_object(self) -> S3Object:
"""Get the `object` property as an S3Object"""
# Note: this name conflicts with existing python builtins
- return S3Object(self._data)
+ return S3Object(self["object"])
class S3EventRecordGlacierRestoreEventData(DictWrapper):
@property
def lifecycle_restoration_expiry_time(self) -> str:
"""Time when the object restoration will be expired."""
- return self["restoreEventData"]["lifecycleRestorationExpiryTime"]
+ return self["lifecycleRestorationExpiryTime"]
@property
def lifecycle_restore_storage_class(self) -> str:
"""Source storage class for restore"""
- return self["restoreEventData"]["lifecycleRestoreStorageClass"]
+ return self["lifecycleRestoreStorageClass"]
class S3EventRecordGlacierEventData(DictWrapper):
@@ -236,7 +236,7 @@ def restore_event_data(self) -> S3EventRecordGlacierRestoreEventData:
The glacierEventData key is only visible for s3:ObjectRestore:Completed events
"""
- return S3EventRecordGlacierRestoreEventData(self._data)
+ return S3EventRecordGlacierRestoreEventData(self["restoreEventData"])
class S3EventRecord(DictWrapper):
@@ -272,7 +272,7 @@ def user_identity(self) -> S3Identity:
@property
def request_parameters(self) -> S3RequestParameters:
- return S3RequestParameters(self._data)
+ return S3RequestParameters(self["requestParameters"])
@property
def response_elements(self) -> dict[str, str]:
@@ -286,7 +286,7 @@ def response_elements(self) -> dict[str, str]:
@property
def s3(self) -> S3Message:
- return S3Message(self._data)
+ return S3Message(self["s3"])
@property
def glacier_event_data(self) -> S3EventRecordGlacierEventData | None:
diff --git a/aws_lambda_powertools/utilities/data_classes/ses_event.py b/aws_lambda_powertools/utilities/data_classes/ses_event.py
index e50ec9ccc56..1c405e540a7 100644
--- a/aws_lambda_powertools/utilities/data_classes/ses_event.py
+++ b/aws_lambda_powertools/utilities/data_classes/ses_event.py
@@ -212,11 +212,11 @@ def action(self) -> SESReceiptAction:
class SESMessage(DictWrapper):
@property
def mail(self) -> SESMail:
- return SESMail(self["ses"]["mail"])
+ return SESMail(self["mail"])
@property
def receipt(self) -> SESReceipt:
- return SESReceipt(self["ses"]["receipt"])
+ return SESReceipt(self["receipt"])
class SESEventRecord(DictWrapper):
@@ -232,7 +232,7 @@ def event_version(self) -> str:
@property
def ses(self) -> SESMessage:
- return SESMessage(self._data)
+ return SESMessage(self["ses"])
class SESEvent(DictWrapper):
diff --git a/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py b/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py
index 4b98a82a16b..ae2fd91e829 100644
--- a/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py
+++ b/aws_lambda_powertools/utilities/data_classes/vpc_lattice.py
@@ -16,6 +16,8 @@
class VPCLatticeEventBase(BaseProxyEvent):
+ # is_base64_encoded and path are inherited from BaseProxyEvent class.
+
@property
def body(self) -> str:
"""The VPC Lattice body."""
@@ -169,16 +171,6 @@ def version(self) -> str:
"""The VPC Lattice v2 Event version"""
return self["version"]
- @property
- def is_base64_encoded(self) -> bool | None:
- """A boolean flag to indicate if the applicable request payload is Base64-encode"""
- return self.get("isBase64Encoded")
-
- @property
- def path(self) -> str:
- """The VPC Lattice v2 Event path"""
- return self["path"]
-
@property
def request_context(self) -> vpcLatticeEventV2RequestContext:
"""The VPC Lattice v2 Event request context."""
diff --git a/aws_lambda_powertools/utilities/idempotency/base.py b/aws_lambda_powertools/utilities/idempotency/base.py
index eb4fe0eab5f..1ab1b9fa570 100644
--- a/aws_lambda_powertools/utilities/idempotency/base.py
+++ b/aws_lambda_powertools/utilities/idempotency/base.py
@@ -250,10 +250,14 @@ def _handle_for_status(self, data_record: DataRecord) -> Any | None:
"item should have been expired in-progress because it already time-outed.",
)
- raise IdempotencyAlreadyInProgressError(
+ inprogress_error_message = (
f"Execution already in progress with idempotency key: "
- f"{self.persistence_store.event_key_jmespath}={data_record.idempotency_key}",
+ f"{self.persistence_store.event_key_jmespath}={data_record.idempotency_key}"
)
+ if data_record.sort_key is not None:
+ inprogress_error_message += f" and sort key: {data_record.sort_key}"
+
+ raise IdempotencyAlreadyInProgressError(inprogress_error_message)
response_dict = data_record.response_json_as_dict()
serialized_response = self.output_serializer.from_dict(response_dict) if response_dict else None
diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py b/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py
index 12e025b5e98..e9da1daf8eb 100644
--- a/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py
+++ b/aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py
@@ -27,6 +27,7 @@ def __init__(
in_progress_expiry_timestamp: int | None = None,
response_data: str = "",
payload_hash: str = "",
+ sort_key: str | None = None,
) -> None:
"""
@@ -44,6 +45,8 @@ def __init__(
hashed representation of payload
response_data: str, optional
response data from previous executions using the record
+ sort_key: str, optional
+ sort key when using composite key
"""
self.idempotency_key = idempotency_key
self.payload_hash = payload_hash
@@ -51,6 +54,7 @@ def __init__(
self.in_progress_expiry_timestamp = in_progress_expiry_timestamp
self._status = status
self.response_data = response_data
+ self.sort_key = sort_key
@property
def is_expired(self) -> bool:
diff --git a/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py b/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py
index 0b04ec135c7..18371a7d252 100644
--- a/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py
+++ b/aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py
@@ -168,6 +168,7 @@ def _item_to_data_record(self, item: dict[str, Any]) -> DataRecord:
in_progress_expiry_timestamp=data.get(self.in_progress_expiry_attr),
response_data=data.get(self.data_attr),
payload_hash=data.get(self.validation_key_attr),
+ sort_key=data[self.sort_key_attr] if self.sort_key_attr is not None else None,
)
def _get_record(self, idempotency_key) -> DataRecord:
diff --git a/aws_lambda_powertools/utilities/parser/models/s3.py b/aws_lambda_powertools/utilities/parser/models/s3.py
index 77617832c29..36f8250f94b 100644
--- a/aws_lambda_powertools/utilities/parser/models/s3.py
+++ b/aws_lambda_powertools/utilities/parser/models/s3.py
@@ -53,7 +53,7 @@ class S3Message(BaseModel):
s3SchemaVersion: str
configurationId: str
bucket: S3Bucket
- object: S3Object # noqa: A003,VNE003
+ object: S3Object # noqa: A003
class S3EventNotificationObjectModel(BaseModel):
@@ -71,7 +71,7 @@ class S3EventNotificationEventBridgeBucketModel(BaseModel):
class S3EventNotificationEventBridgeDetailModel(BaseModel):
version: str
bucket: S3EventNotificationEventBridgeBucketModel
- object: S3EventNotificationObjectModel # noqa: A003,VNE003
+ object: S3EventNotificationObjectModel # noqa: A003
request_id: str = Field(..., alias="request-id")
requester: str
source_ip_address: Optional[str] = Field(None, alias="source-ip-address")
diff --git a/docs/Dockerfile b/docs/Dockerfile
index c8538addb5a..09cb94b0049 100644
--- a/docs/Dockerfile
+++ b/docs/Dockerfile
@@ -1,5 +1,5 @@
# v9.1.18
-FROM squidfunk/mkdocs-material@sha256:047452c6641137c9caa3647d050ddb7fa67b59ed48cc67ec3a4995f3d360ab32
+FROM squidfunk/mkdocs-material@sha256:f226a2d2d5983643cab401491fc40e8a5711a50e90c21433f80e91c014cff1f5
# pip-compile --generate-hashes --output-file=requirements.txt requirements.in
COPY requirements.txt /tmp/
RUN pip install --require-hashes -r /tmp/requirements.txt
diff --git a/docs/core/event_handler/_openapi_customization_metadata.md b/docs/core/event_handler/_openapi_customization_metadata.md
index 5a96db582cb..a69f53cd84d 100644
--- a/docs/core/event_handler/_openapi_customization_metadata.md
+++ b/docs/core/event_handler/_openapi_customization_metadata.md
@@ -1,6 +1,6 @@
-Defining and customizing OpenAPI metadata gives detailed, top-level information about your API. Here's the method to set and tailor this metadata:
+Defining and customizing OpenAPI metadata gives detailed, top-level information about your API. Use the method `app.configure_openapi` to set and tailor this metadata:
| Field Name | Type | Description |
| ------------------ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
diff --git a/docs/core/event_handler/api_gateway.md b/docs/core/event_handler/api_gateway.md
index f2a60697740..4919598b3ec 100644
--- a/docs/core/event_handler/api_gateway.md
+++ b/docs/core/event_handler/api_gateway.md
@@ -309,7 +309,7 @@ Let's rewrite the previous examples to signal our resolver what shape we expect
!!! info "By default, we hide extended error details for security reasons _(e.g., pydantic url, Pydantic code)_."
-Any incoming request that fails validation will lead to a `HTTP 422: Unprocessable Entity error` response that will look similar to this:
+Any incoming request or and outgoing response that fails validation will lead to a `HTTP 422: Unprocessable Entity error` response that will look similar to this:
```json hl_lines="2 3" title="data_validation_error_unsanitized_output.json"
--8<-- "examples/event_handler_rest/src/data_validation_error_unsanitized_output.json"
@@ -321,8 +321,6 @@ Here's an example where we catch validation errors, log all details for further
=== "data_validation_sanitized_error.py"
- Note that Pydantic versions [1](https://docs.pydantic.dev/1.10/usage/models/#error-handling){target="_blank" rel="nofollow"} and [2](https://docs.pydantic.dev/latest/errors/errors/){target="_blank" rel="nofollow"} report validation detailed errors differently.
-
```python hl_lines="8 24-25 31"
--8<-- "examples/event_handler_rest/src/data_validation_sanitized_error.py"
```
@@ -398,6 +396,27 @@ We use the `Annotated` and OpenAPI `Body` type to instruct Event Handler that ou
--8<-- "examples/event_handler_rest/src/validating_payload_subset_output.json"
```
+#### Validating responses
+
+You can use `response_validation_error_http_code` to set a custom HTTP code for failed response validation. When this field is set, we will raise a `ResponseValidationError` instead of a `RequestValidationError`.
+
+=== "customizing_response_validation.py"
+
+ ```python hl_lines="1 16 29 33"
+ --8<-- "examples/event_handler_rest/src/customizing_response_validation.py"
+ ```
+
+ 1. A response with status code set here will be returned if response data is not valid.
+ 2. Operation returns a string as oppose to a `Todo` object. This will lead to a `500` response as set in line 18.
+
+=== "customizing_response_validation_exception.py"
+
+ ```python hl_lines="1 18 38 39"
+ --8<-- "examples/event_handler_rest/src/customizing_response_validation_exception.py"
+ ```
+
+ 1. The distinct `ResponseValidationError` exception can be caught to customise the response.
+
#### Validating query strings
!!! info "We will automatically validate and inject incoming query strings via type annotation."
@@ -1053,7 +1072,7 @@ Include extra parameters when exporting your OpenAPI specification to apply thes
=== "customizing_api_metadata.py"
- ```python hl_lines="25-31"
+ ```python hl_lines="8-16"
--8<-- "examples/event_handler_rest/src/customizing_api_metadata.py"
```
@@ -1089,7 +1108,7 @@ Security schemes are declared at the top-level first. You can reference them glo
=== "Global OpenAPI security schemes"
- ```python title="security_schemes_global.py" hl_lines="32-42"
+ ```python title="security_schemes_global.py" hl_lines="17-27"
--8<-- "examples/event_handler_rest/src/security_schemes_global.py"
```
@@ -1097,7 +1116,7 @@ Security schemes are declared at the top-level first. You can reference them glo
=== "Per Operation security"
- ```python title="security_schemes_per_operation.py" hl_lines="17 32-41"
+ ```python title="security_schemes_per_operation.py" hl_lines="17-26 30"
--8<-- "examples/event_handler_rest/src/security_schemes_per_operation.py"
```
@@ -1105,7 +1124,7 @@ Security schemes are declared at the top-level first. You can reference them glo
=== "Global security schemes and optional security per route"
- ```python title="security_schemes_global_and_optional.py" hl_lines="22 37-46"
+ ```python title="security_schemes_global_and_optional.py" hl_lines="17-26 35"
--8<-- "examples/event_handler_rest/src/security_schemes_global_and_optional.py"
```
diff --git a/docs/core/event_handler/appsync.md b/docs/core/event_handler/appsync.md
index 0c556dedfbf..a006a3f1415 100644
--- a/docs/core/event_handler/appsync.md
+++ b/docs/core/event_handler/appsync.md
@@ -586,7 +586,7 @@ Here's an example of how you can test your synchronous resolvers:
=== "assert_graphql_response_module.py"
- ```python hl_lines="11"
+ ```python hl_lines="10"
--8<-- "examples/event_handler_graphql/src/assert_graphql_response_module.py"
```
diff --git a/docs/core/event_handler/bedrock_agents.md b/docs/core/event_handler/bedrock_agents.md
index 32aa2835491..d5c1d1c9534 100644
--- a/docs/core/event_handler/bedrock_agents.md
+++ b/docs/core/event_handler/bedrock_agents.md
@@ -319,7 +319,7 @@ Test your routes by passing an [Agent for Amazon Bedrock proxy event](https://do
=== "assert_bedrock_agent_response.py"
- ```python hl_lines="21-23 27"
+ ```python hl_lines="22-24 28"
--8<-- "examples/event_handler_bedrock_agents/src/assert_bedrock_agent_response.py"
```
diff --git a/docs/core/logger.md b/docs/core/logger.md
index 5d7c7941b72..caf3381853b 100644
--- a/docs/core/logger.md
+++ b/docs/core/logger.md
@@ -681,13 +681,16 @@ sequenceDiagram
4. **What happens if the log buffer reaches its maximum size?** Older logs are removed from the buffer to make room for new logs. This means that if the buffer is full, you may lose some logs if they are not flushed before the buffer reaches its maximum size. When this happens, we emit a warning when flushing the buffer to indicate that some logs have been dropped.
-5. **What timestamp is used when I flush the logs?** The timestamp preserves the original time when the log record was created. If you create a log record at 11:00:10 and flush it at 11:00:25, the log line will retain its original timestamp of 11:00:10.
+5. **How is the log size of a log line calculated?**
+The log size is calculated based on the size of the log line in bytes. This includes the size of the log message, any exception (if present), the log line location, additional keys, and the timestamp.
-6. **What happens if I try to add a log line that is bigger than max buffer size?** The log will be emitted directly to standard output and not buffered. When this happens, we emit a warning to indicate that the log line was too big to be buffered.
+6. **What timestamp is used when I flush the logs?** The timestamp preserves the original time when the log record was created. If you create a log record at 11:00:10 and flush it at 11:00:25, the log line will retain its original timestamp of 11:00:10.
-7. **What happens if Lambda times out without flushing the buffer?** Logs that are still in the buffer will be lost.
+7. **What happens if I try to add a log line that is bigger than max buffer size?** The log will be emitted directly to standard output and not buffered. When this happens, we emit a warning to indicate that the log line was too big to be buffered.
-8. **Do child loggers inherit the buffer?** No, child loggers do not inherit the buffer from their parent logger but only the buffer configuration. This means that if you create a child logger, it will have its own buffer and will not share the buffer with the parent logger.
+8. **What happens if Lambda times out without flushing the buffer?** Logs that are still in the buffer will be lost.
+
+9. **Do child loggers inherit the buffer?** No, child loggers do not inherit the buffer from their parent logger but only the buffer configuration. This means that if you create a child logger, it will have its own buffer and will not share the buffer with the parent logger.
### Built-in Correlation ID expressions
diff --git a/docs/core/metrics.md b/docs/core/metrics.md
index 88f0292231d..aa52e9b98e8 100644
--- a/docs/core/metrics.md
+++ b/docs/core/metrics.md
@@ -34,13 +34,12 @@ If you're new to Amazon CloudWatch, there are five terminologies you must be awa
???+ tip
All examples shared in this documentation are available within the [project repository](https://github.com/aws-powertools/powertools-lambda-python/tree/develop/examples){target="_blank"}.
-Metric has three global settings that will be used across all metrics emitted:
+Metric has two global settings that will be used across all metrics emitted:
| Setting | Description | Environment variable | Constructor parameter |
| ------------------------------- | ------------------------------------------------------------------------------- | ------------------------------ | --------------------- |
| **Metric namespace** | Logical container where all metrics will be placed e.g. `ServerlessAirline` | `POWERTOOLS_METRICS_NAMESPACE` | `namespace` |
| **Service** | Optionally, sets **service** metric dimension across all metrics e.g. `payment` | `POWERTOOLS_SERVICE_NAME` | `service` |
-| **Disable Powertools Metrics** | Optionally, disables all Powertools metrics. | `POWERTOOLS_METRICS_DISABLED` | N/A |
???+ info
`POWERTOOLS_METRICS_DISABLED` will not disable default metrics created by AWS services.
@@ -48,7 +47,7 @@ Metric has three global settings that will be used across all metrics emitted:
???+ tip
Use your application or main service as the metric namespace to easily group all metrics.
-```yaml hl_lines="13" title="AWS Serverless Application Model (SAM) example"
+```yaml hl_lines="12-14" title="AWS Serverless Application Model (SAM) example"
--8<-- "examples/metrics/sam/template.yaml"
```
@@ -214,13 +213,32 @@ This has the advantage of keeping cold start metric separate from your applicati
???+ info
We do not emit 0 as a value for ColdStart metric for cost reasons. [Let us know](https://github.com/aws-powertools/powertools-lambda-python/issues/new?assignees=&labels=feature-request%2C+triage&template=feature_request.md&title=){target="_blank"} if you'd prefer a flag to override it.
+#### Customizing function name for cold start metrics
+
+When emitting cold start metrics, the `function_name` dimension defaults to `context.function_name`. If you want to change the value you can set the `function_name` parameter in the metrics constructor, or define the environment variable `POWERTOOLS_METRICS_FUNCTION_NAME`.
+
+The priority of the `function_name` dimension value is defined as:
+
+1. `function_name` constructor option
+2. `POWERTOOLS_METRICS_FUNCTION_NAME` environment variable
+3. `context.function_name` property
+
+=== "working_with_custom_cold_start_function_name.py"
+
+ ```python hl_lines="4"
+ --8<-- "examples/metrics/src/working_with_custom_cold_start_function_name.py"
+ ```
+
### Environment variables
The following environment variable is available to configure Metrics at a global scope:
-| Setting | Description | Environment variable | Default |
-| ------------------ | -------------------------------- | ------------------------------ | ------- |
-| **Namespace Name** | Sets namespace used for metrics. | `POWERTOOLS_METRICS_NAMESPACE` | `None` |
+| Setting | Description | Environment variable | Default |
+| ------------------ | ------------------------------------------------------------ | ---------------------------------- | ------- |
+| **Namespace Name** | Sets **namespace** used for metrics. | `POWERTOOLS_METRICS_NAMESPACE` | `None` |
+| **Service** | Sets **service** metric dimension across all metrics e.g. `payment` | `POWERTOOLS_SERVICE_NAME` | `None` |
+| **Function Name** | Function name used as dimension for the **ColdStart** metric. | `POWERTOOLS_METRICS_FUNCTION_NAME` | `None` |
+| **Disable Powertools Metrics** | **Disables** all metrics emitted by Powertools. | `POWERTOOLS_METRICS_DISABLED` | `None` |
`POWERTOOLS_METRICS_NAMESPACE` is also available on a per-instance basis with the `namespace` parameter, which will consequently override the environment variable value.
@@ -425,7 +443,7 @@ You can read standard output and assert whether metrics have been flushed. Here'
This will be needed when using `capture_cold_start_metric=True`, or when both `Metrics` and `single_metric` are used.
- ```python hl_lines="20-21 27"
+ ```python hl_lines="21-22 28"
--8<-- "examples/metrics/src/assert_multiple_emf_blobs.py"
```
diff --git a/docs/includes/_layer_homepage_arm64.md b/docs/includes/_layer_homepage_arm64.md
index 2e5c19d2854..7bc3f73e2bd 100644
--- a/docs/includes/_layer_homepage_arm64.md
+++ b/docs/includes/_layer_homepage_arm64.md
@@ -5,178 +5,178 @@
| Region | Layer ARN |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-arm64:10**{: .copyMe}:clipboard: |
=== "Python 3.10"
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-arm64:10**{: .copyMe}:clipboard: |
=== "Python 3.11"
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-arm64:10**{: .copyMe}:clipboard: |
=== "Python 3.12"
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10**{: .copyMe}:clipboard: |
=== "Python 3.13"
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:10**{: .copyMe}:clipboard: |
diff --git a/docs/includes/_layer_homepage_x86.md b/docs/includes/_layer_homepage_x86.md
index bc9ec439eee..ecdb60da599 100644
--- a/docs/includes/_layer_homepage_x86.md
+++ b/docs/includes/_layer_homepage_x86.md
@@ -5,183 +5,183 @@
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python39-x86_64:10**{: .copyMe}:clipboard: |
=== "Python 3.10"
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python310-x86_64:10**{: .copyMe}:clipboard: |
=== "Python 3.11"
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python311-x86_64:10**{: .copyMe}:clipboard: |
=== "Python 3.12"
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10**{: .copyMe}:clipboard: |
=== "Python 3.13"
| Region | Layer ARN |
| -------------------- | --------------------------------------------------------------------------------------------------------- |
- | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
- | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:9**{: .copyMe}:clipboard: |
+ | **`af-south-1`** | **arn:aws:lambda:af-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-east-1`** | **arn:aws:lambda:ap-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-1`** | **arn:aws:lambda:ap-northeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-2`** | **arn:aws:lambda:ap-northeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-northeast-3`** | **arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-1`** | **arn:aws:lambda:ap-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-south-2`** | **arn:aws:lambda:ap-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-1`** | **arn:aws:lambda:ap-southeast-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-2`** | **arn:aws:lambda:ap-southeast-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-3`** | **arn:aws:lambda:ap-southeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-4`** | **arn:aws:lambda:ap-southeast-4:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-5`** | **arn:aws:lambda:ap-southeast-5:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ap-southeast-7`** | **arn:aws:lambda:ap-southeast-7:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-central-1`** | **arn:aws:lambda:ca-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`ca-west-1`** | **arn:aws:lambda:ca-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-1`** | **arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-central-2`** | **arn:aws:lambda:eu-central-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-north-1`** | **arn:aws:lambda:eu-north-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-1`** | **arn:aws:lambda:eu-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-south-2`** | **arn:aws:lambda:eu-south-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-1`** | **arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-2`** | **arn:aws:lambda:eu-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`eu-west-3`** | **arn:aws:lambda:eu-west-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`il-central-1`** | **arn:aws:lambda:il-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-central-1`** | **arn:aws:lambda:me-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`me-south-1`** | **arn:aws:lambda:me-south-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`mx-central-1`** | **arn:aws:lambda:mx-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`sa-east-1`** | **arn:aws:lambda:sa-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-1`** | **arn:aws:lambda:us-east-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-east-2`** | **arn:aws:lambda:us-east-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-1`** | **arn:aws:lambda:us-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
+ | **`us-west-2`** | **arn:aws:lambda:us-west-2:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-x86_64:10**{: .copyMe}:clipboard: |
diff --git a/docs/index.md b/docs/index.md
index 3edc386ee50..6382af58879 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -63,7 +63,7 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc
=== "Lambda Layer"
- [Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install), and remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-layer-cdk/blob/d24716744f7d1f37617b4998c992c4c067e19e64/layer/Python/Dockerfile#L36){target="_blank"} to achieve the most optimal size.
+ [Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install), and remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/layer_v3/docker/Dockerfile#L34){target="_blank"} to achieve the most optimal size.
For the latter, make sure to replace `{region}` with your AWS region, e.g., `eu-west-1`, and the `{python_version}` without the period (.), e.g., `python313` for `Python 3.13`.
@@ -205,14 +205,14 @@ You can install Powertools for AWS Lambda (Python) using your favorite dependenc
You can use AWS CLI to generate a pre-signed URL to download the contents of our Lambda Layer.
```bash title="AWS CLI command to download Lambda Layer content"
- aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9 --region eu-west-1
+ aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10 --region eu-west-1
```
You'll find the pre-signed URL under `Location` key as part of the CLI command output.
=== "Lambda Layer (GovCloud)"
- [Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install), and remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-layer-cdk/blob/d24716744f7d1f37617b4998c992c4c067e19e64/layer/Python/Dockerfile#L36){target="_blank"} to achieve the most optimal size.
+ [Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html){target="_blank"} is a .zip file archive that can contain additional code, pre-packaged dependencies, data, or configuration files. We compile and optimize [all dependencies](#install), and remove duplicate dependencies [already available in the Lambda runtime](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/layer_v3/docker/Dockerfile#L34){target="_blank"} to achieve the most optimal size.
For the latter, make sure to replace `{python_version}` without the period (.), e.g., `python313` for `Python 3.13`.
@@ -319,7 +319,7 @@ In this context, `[aws-sdk]` is an alias to the `boto3` package. Due to dependen
The pre-signed URL to download this Lambda Layer will be within `Location` key in the CLI output. The CLI output will also contain the Powertools for AWS Lambda version it contains.
```bash title="AWS CLI command to download Lambda Layer content"
-aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9 --region eu-west-1
+aws lambda get-layer-version-by-arn --arn arn:aws:lambda:eu-west-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10 --region eu-west-1
```
#### SAR
@@ -405,19 +405,21 @@ Core utilities such as Tracing, Logging, Metrics, and Event Handler will be avai
| Environment variable | Description | Utility | Default |
| ----------------------------------------- | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------- |
-| __POWERTOOLS_SERVICE_NAME__ | Sets service name used for tracing namespace, metrics dimension and structured logging | All | `"service_undefined"` |
-| __POWERTOOLS_METRICS_NAMESPACE__ | Sets namespace used for metrics | [Metrics](./core/metrics.md){target="_blank"} | `None` |
-| __POWERTOOLS_TRACE_DISABLED__ | Explicitly disables tracing | [Tracing](./core/tracer.md){target="_blank"} | `false` |
-| __POWERTOOLS_TRACER_CAPTURE_RESPONSE__ | Captures Lambda or method return as metadata. | [Tracing](./core/tracer.md){target="_blank"} | `true` |
-| __POWERTOOLS_TRACER_CAPTURE_ERROR__ | Captures Lambda or method exception as metadata. | [Tracing](./core/tracer.md){target="_blank"} | `true` |
-| __POWERTOOLS_TRACE_MIDDLEWARES__ | Creates sub-segment for each custom middleware | [Middleware factory](./utilities/middleware_factory.md){target="_blank"} | `false` |
-| __POWERTOOLS_LOGGER_LOG_EVENT__ | Logs incoming event | [Logging](./core/logger.md){target="_blank"} | `false` |
-| __POWERTOOLS_LOGGER_SAMPLE_RATE__ | Debug log sampling | [Logging](./core/logger.md){target="_blank"} | `0` |
-| __POWERTOOLS_LOG_DEDUPLICATION_DISABLED__ | Disables log deduplication filter protection to use Pytest Live Log feature | [Logging](./core/logger.md){target="_blank"} | `false` |
-| __POWERTOOLS_PARAMETERS_MAX_AGE__ | Adjust how long values are kept in cache (in seconds) | [Parameters](./utilities/parameters.md#adjusting-cache-ttl){target="_blank"} | `5` |
-| __POWERTOOLS_PARAMETERS_SSM_DECRYPT__ | Sets whether to decrypt or not values retrieved from AWS SSM Parameters Store | [Parameters](./utilities/parameters.md#ssmprovider){target="_blank"} | `false` |
-| __POWERTOOLS_DEV__ | Increases verbosity across utilities | Multiple; see [POWERTOOLS_DEV effect below](#optimizing-for-non-production-environments) | `false` |
-| __POWERTOOLS_LOG_LEVEL__ | Sets logging level | [Logging](./core/logger.md){target="_blank"} | `INFO` |
+| **POWERTOOLS_SERVICE_NAME** | Sets service name used for tracing namespace, metrics dimension and structured logging | All | `"service_undefined"` |
+| **POWERTOOLS_METRICS_NAMESPACE** | Sets namespace used for metrics | [Metrics](./core/metrics.md){target="_blank"} | `None` |
+| **POWERTOOLS_METRICS_FUNCTION_NAME** | Function name used as dimension for the **ColdStart** metric metrics | [Metrics](./core/metrics.md){target="_blank"} | `None` |
+| **POWERTOOLS_METRICS_DISABLED** | **Disables** all metrics emitted by Powertools metrics | [Metrics](./core/metrics.md){target="_blank"} | `None` |
+| **POWERTOOLS_TRACE_DISABLED** | Explicitly disables tracing | [Tracing](./core/tracer.md){target="_blank"} | `false` |
+| **POWERTOOLS_TRACER_CAPTURE_RESPONSE** | Captures Lambda or method return as metadata. | [Tracing](./core/tracer.md){target="_blank"} | `true` |
+| **POWERTOOLS_TRACER_CAPTURE_ERROR** | Captures Lambda or method exception as metadata. | [Tracing](./core/tracer.md){target="_blank"} | `true` |
+| **POWERTOOLS_TRACE_MIDDLEWARES** | Creates sub-segment for each custom middleware | [Middleware factory](./utilities/middleware_factory.md){target="_blank"} | `false` |
+| **POWERTOOLS_LOGGER_LOG_EVENT** | Logs incoming event | [Logging](./core/logger.md){target="_blank"} | `false` |
+| **POWERTOOLS_LOGGER_SAMPLE_RATE** | Debug log sampling | [Logging](./core/logger.md){target="_blank"} | `0` |
+| **POWERTOOLS_LOG_DEDUPLICATION_DISABLED** | Disables log deduplication filter protection to use Pytest Live Log feature | [Logging](./core/logger.md){target="_blank"} | `false` |
+| **POWERTOOLS_PARAMETERS_MAX_AGE** | Adjust how long values are kept in cache (in seconds) | [Parameters](./utilities/parameters.md#adjusting-cache-ttl){target="_blank"} | `5` |
+| **POWERTOOLS_PARAMETERS_SSM_DECRYPT** | Sets whether to decrypt or not values retrieved from AWS SSM Parameters Store | [Parameters](./utilities/parameters.md#ssmprovider){target="_blank"} | `false` |
+| **POWERTOOLS_DEV** | Increases verbosity across utilities | Multiple; see [POWERTOOLS_DEV effect below](#optimizing-for-non-production-environments) | `false` |
+| **POWERTOOLS_LOG_LEVEL** | Sets logging level | [Logging](./core/logger.md){target="_blank"} | `INFO` |
### Optimizing for non-production environments
@@ -514,6 +516,9 @@ Knowing which companies are using this library is important to help prioritize t
[**globaldatanet**](https://globaldatanet.com/){target="_blank" rel="nofollow"}
{ .card }
+[**Guild**](https://guild.com/){target="_blank" rel="nofollow"}
+{ .card }
+
[**IMS**](https://ims.tech/){target="_blank" rel="nofollow"}
{ .card }
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
index b5baded64aa..e4c38e21b6b 100644
--- a/docs/overrides/main.html
+++ b/docs/overrides/main.html
@@ -1,12 +1,5 @@
{% extends "base.html" %}
-{% block announce %}
-On March 25th 2025, v2 reaches
- End-of-Life. We recommend you to upgrade to v3.
-{% endblock %}
-
{% block outdated %}
You're not viewing the latest version.
diff --git a/docs/upgrade.md b/docs/upgrade.md
index 43243741103..0e57d8fb609 100644
--- a/docs/upgrade.md
+++ b/docs/upgrade.md
@@ -5,6 +5,12 @@ description: Guide to update between major Powertools for AWS Lambda (Python) ve
+## End of support v2
+
+!!! warning "On March 25st, 2025, Powertools for AWS Lambda (Python) v2 reached end of support and will no longer receive updates or releases. If you are still using v2, we strongly recommend you to read our upgrade guide and update to the latest version."
+
+Given our commitment to all of our customers using Powertools for AWS Lambda (Python), we will keep [Pypi](https://pypi.org/project/aws-lambda-powertools/){target="_blank"} v2 releases and documentation 2.x versions to prevent any disruption.
+
## Migrate to v3 from v2
!!! info "We strongly encourage you to migrate to v3. However, if you still need to upgrade from v1 to v2, you can find the [upgrade guide](/lambda/python/2.43.1/upgrade/)."
diff --git a/docs/utilities/data_masking.md b/docs/utilities/data_masking.md
index 94e470aa965..1de6419c390 100644
--- a/docs/utilities/data_masking.md
+++ b/docs/utilities/data_masking.md
@@ -671,7 +671,7 @@ Testing your code with a simple erase operation
=== "test_lambda_mask.py"
-```python hl_lines="22"
+```python
--8<-- "examples/data_masking/tests/test_lambda_mask.py"
```
diff --git a/docs/versioning.md b/docs/versioning.md
index 04b4e23a1a0..febcc616045 100644
--- a/docs/versioning.md
+++ b/docs/versioning.md
@@ -69,6 +69,7 @@ To see the list of available major versions of Powertools for AWS Lambda and whe
| SDK | Major version | Current Phase | General Availability Date | Notes |
| -------------------------------- | ------------- | -------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Powertools for AWS Lambda (Python) | 2.x | End of Support | 09/23/2024 | See [upgrade guide](https://docs.powertools.aws.dev/lambda/python/latest/upgrade/) |
| Powertools for AWS Lambda (Python) | 2.x | Maintenance Announcement | 09/25/2024 | See [announcement](https://github.com/aws-powertools/powertools-lambda-python/issues/5239) |
| Powertools for AWS Lambda (Python) | 3.x | General Availability | 09/23/2024 | See [Release notes](https://github.com/aws-powertools/powertools-lambda-python/releases/tag/v3.0.0) |
| Powertools for AWS Lambda (Python) | 3.x | Developer Preview | | See [RFC](https://github.com/aws-powertools/powertools-lambda-python/issues/4189) |
diff --git a/examples/batch_processing/src/getting_started_with_test.py b/examples/batch_processing/src/getting_started_with_test.py
index 49e78269248..73df04d4d7b 100644
--- a/examples/batch_processing/src/getting_started_with_test.py
+++ b/examples/batch_processing/src/getting_started_with_test.py
@@ -11,15 +11,16 @@ def load_event(path: Path):
return json.load(f)
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
- aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
+ aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
@@ -29,7 +30,7 @@ def sqs_event():
return load_event(path=Path("events/sqs_event.json"))
-def test_app_batch_partial_response(sqs_event, lambda_context):
+def test_app_batch_partial_response(sqs_event, lambda_context: LambdaContext):
# GIVEN
processor_result = processor # access processor for additional assertions
successful_record = sqs_event["Records"][0]
diff --git a/examples/data_masking/tests/test_lambda_mask.py b/examples/data_masking/tests/test_lambda_mask.py
index 596f065b380..19462e4a19e 100644
--- a/examples/data_masking/tests/test_lambda_mask.py
+++ b/examples/data_masking/tests/test_lambda_mask.py
@@ -4,18 +4,19 @@
import test_lambda_mask
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:111111111:function:test"
- aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:111111111:function:test"
+ aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+ def get_remaining_time_in_millis(self) -> int:
+ return 5
- def get_remaining_time_in_millis(self) -> int:
- return 5
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/examples/event_handler_bedrock_agents/src/assert_bedrock_agent_response.py b/examples/event_handler_bedrock_agents/src/assert_bedrock_agent_response.py
index 07f3273961e..4b172ce2df9 100644
--- a/examples/event_handler_bedrock_agents/src/assert_bedrock_agent_response.py
+++ b/examples/event_handler_bedrock_agents/src/assert_bedrock_agent_response.py
@@ -4,19 +4,20 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
- aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
+ aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
-def test_lambda_handler(lambda_context):
+def test_lambda_handler(lambda_context: LambdaContext):
minimal_event = {
"apiPath": "/current_time",
"httpMethod": "GET",
diff --git a/examples/event_handler_graphql/src/assert_async_graphql_response.py b/examples/event_handler_graphql/src/assert_async_graphql_response.py
index bb1b429c43c..7ee389a8b13 100644
--- a/examples/event_handler_graphql/src/assert_async_graphql_response.py
+++ b/examples/event_handler_graphql/src/assert_async_graphql_response.py
@@ -10,15 +10,16 @@
)
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
- aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
+ aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/examples/event_handler_graphql/src/assert_graphql_response.py b/examples/event_handler_graphql/src/assert_graphql_response.py
index d78698e109b..4fe51554332 100644
--- a/examples/event_handler_graphql/src/assert_graphql_response.py
+++ b/examples/event_handler_graphql/src/assert_graphql_response.py
@@ -8,15 +8,16 @@
from assert_graphql_response_module import Location, app # instance of AppSyncResolver
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
- aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
+ aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/examples/event_handler_rest/src/assert_alb_api_resolver_response.py b/examples/event_handler_rest/src/assert_alb_api_resolver_response.py
index f6bd54facee..e0981215a8b 100644
--- a/examples/event_handler_rest/src/assert_alb_api_resolver_response.py
+++ b/examples/event_handler_rest/src/assert_alb_api_resolver_response.py
@@ -4,19 +4,20 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
- aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
+ aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
-def test_lambda_handler(lambda_context):
+def test_lambda_handler(lambda_context: LambdaContext):
minimal_event = {
"path": "/todos",
"httpMethod": "GET",
diff --git a/examples/event_handler_rest/src/assert_function_url_api_resolver_response.py b/examples/event_handler_rest/src/assert_function_url_api_resolver_response.py
index 865f26b70a3..2c591f640be 100644
--- a/examples/event_handler_rest/src/assert_function_url_api_resolver_response.py
+++ b/examples/event_handler_rest/src/assert_function_url_api_resolver_response.py
@@ -4,19 +4,20 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
- aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
+ aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
-def test_lambda_handler(lambda_context):
+def test_lambda_handler(lambda_context: LambdaContext):
minimal_event = {
"rawPath": "/todos",
"requestContext": {
diff --git a/examples/event_handler_rest/src/assert_http_api_resolver_response.py b/examples/event_handler_rest/src/assert_http_api_resolver_response.py
index af294fbc3bc..36b59a69fd2 100644
--- a/examples/event_handler_rest/src/assert_http_api_resolver_response.py
+++ b/examples/event_handler_rest/src/assert_http_api_resolver_response.py
@@ -4,19 +4,20 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
- aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
+ aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
-def test_lambda_handler(lambda_context):
+def test_lambda_handler(lambda_context: LambdaContext):
minimal_event = {
"rawPath": "/todos",
"requestContext": {
diff --git a/examples/event_handler_rest/src/assert_rest_api_resolver_response.py b/examples/event_handler_rest/src/assert_rest_api_resolver_response.py
index 4422022ae5f..80166b5b548 100644
--- a/examples/event_handler_rest/src/assert_rest_api_resolver_response.py
+++ b/examples/event_handler_rest/src/assert_rest_api_resolver_response.py
@@ -4,15 +4,16 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
- aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:123456789012:function:test"
+ aws_request_id: str = "da658bd3-2d6f-4e7b-8ec2-937234644fdc"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/examples/event_handler_rest/src/customizing_api_metadata.py b/examples/event_handler_rest/src/customizing_api_metadata.py
index cd9ced455d2..9297045ea1a 100644
--- a/examples/event_handler_rest/src/customizing_api_metadata.py
+++ b/examples/event_handler_rest/src/customizing_api_metadata.py
@@ -5,6 +5,15 @@
from aws_lambda_powertools.utilities.typing import LambdaContext
app = APIGatewayRestResolver(enable_validation=True)
+app.configure_openapi(
+ title="TODO's API",
+ version="1.21.3",
+ summary="API to manage TODOs",
+ description="This API implements all the CRUD operations for the TODO app",
+ tags=["todos"],
+ servers=[Server(url="https://stg.example.org/orders", description="Staging server")],
+ contact=Contact(name="John Smith", email="john@smith.com"),
+)
@app.get("/todos/")
@@ -20,14 +29,4 @@ def lambda_handler(event: dict, context: LambdaContext) -> dict:
if __name__ == "__main__":
- print(
- app.get_openapi_json_schema(
- title="TODO's API",
- version="1.21.3",
- summary="API to manage TODOs",
- description="This API implements all the CRUD operations for the TODO app",
- tags=["todos"],
- servers=[Server(url="https://stg.example.org/orders", description="Staging server")],
- contact=Contact(name="John Smith", email="john@smith.com"),
- ),
- )
+ print(app.get_openapi_json_schema())
diff --git a/examples/event_handler_rest/src/customizing_response_validation.py b/examples/event_handler_rest/src/customizing_response_validation.py
new file mode 100644
index 00000000000..2b7b2c16c9f
--- /dev/null
+++ b/examples/event_handler_rest/src/customizing_response_validation.py
@@ -0,0 +1,39 @@
+from http import HTTPStatus
+from typing import Optional
+
+import requests
+from pydantic import BaseModel, Field
+
+from aws_lambda_powertools import Logger, Tracer
+from aws_lambda_powertools.event_handler import APIGatewayRestResolver
+from aws_lambda_powertools.logging import correlation_paths
+from aws_lambda_powertools.utilities.typing import LambdaContext
+
+tracer = Tracer()
+logger = Logger()
+app = APIGatewayRestResolver(
+ enable_validation=True,
+ response_validation_error_http_code=HTTPStatus.INTERNAL_SERVER_ERROR, # (1)!
+)
+
+
+class Todo(BaseModel):
+ userId: int
+ id_: Optional[int] = Field(alias="id", default=None)
+ title: str
+ completed: bool
+
+
+@app.get("/todos_bad_response/")
+@tracer.capture_method
+def get_todo_by_id(todo_id: int) -> Todo:
+ todo = requests.get(f"https://jsonplaceholder.typicode.com/todos/{todo_id}")
+ todo.raise_for_status()
+
+ return todo.json()["title"] # (2)!
+
+
+@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_HTTP)
+@tracer.capture_lambda_handler
+def lambda_handler(event: dict, context: LambdaContext) -> dict:
+ return app.resolve(event, context)
diff --git a/examples/event_handler_rest/src/customizing_response_validation_exception.py b/examples/event_handler_rest/src/customizing_response_validation_exception.py
new file mode 100644
index 00000000000..c94ace290d2
--- /dev/null
+++ b/examples/event_handler_rest/src/customizing_response_validation_exception.py
@@ -0,0 +1,52 @@
+from http import HTTPStatus
+from typing import Optional
+
+import requests
+from pydantic import BaseModel, Field
+
+from aws_lambda_powertools import Logger, Tracer
+from aws_lambda_powertools.event_handler import APIGatewayRestResolver, content_types
+from aws_lambda_powertools.event_handler.api_gateway import Response
+from aws_lambda_powertools.event_handler.openapi.exceptions import ResponseValidationError
+from aws_lambda_powertools.logging import correlation_paths
+from aws_lambda_powertools.utilities.typing import LambdaContext
+
+tracer = Tracer()
+logger = Logger()
+app = APIGatewayRestResolver(
+ enable_validation=True,
+ response_validation_error_http_code=HTTPStatus.INTERNAL_SERVER_ERROR,
+)
+
+
+class Todo(BaseModel):
+ userId: int
+ id_: Optional[int] = Field(alias="id", default=None)
+ title: str
+ completed: bool
+
+
+@app.get("/todos_bad_response/")
+@tracer.capture_method
+def get_todo_by_id(todo_id: int) -> Todo:
+ todo = requests.get(f"https://jsonplaceholder.typicode.com/todos/{todo_id}")
+ todo.raise_for_status()
+
+ return todo.json()["title"]
+
+
+@app.exception_handler(ResponseValidationError) # (1)!
+def handle_response_validation_error(ex: ResponseValidationError):
+ logger.error("Request failed validation", path=app.current_event.path, errors=ex.errors())
+
+ return Response(
+ status_code=500,
+ content_type=content_types.APPLICATION_JSON,
+ body="Unexpected response.",
+ )
+
+
+@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_HTTP)
+@tracer.capture_lambda_handler
+def lambda_handler(event: dict, context: LambdaContext) -> dict:
+ return app.resolve(event, context)
diff --git a/examples/event_handler_rest/src/security_schemes_global.py b/examples/event_handler_rest/src/security_schemes_global.py
index 3a3ef5ce6f4..762bc077596 100644
--- a/examples/event_handler_rest/src/security_schemes_global.py
+++ b/examples/event_handler_rest/src/security_schemes_global.py
@@ -12,6 +12,20 @@
logger = Logger()
app = APIGatewayRestResolver(enable_validation=True)
+app.configure_openapi(
+ title="My API",
+ security_schemes={
+ "oauth": OAuth2(
+ flows=OAuthFlows(
+ authorizationCode=OAuthFlowAuthorizationCode(
+ authorizationUrl="https://xxx.amazoncognito.com/oauth2/authorize",
+ tokenUrl="https://xxx.amazoncognito.com/oauth2/token",
+ ),
+ ),
+ ),
+ },
+ security=[{"oauth": ["admin"]}], # (1)!)
+)
@app.get("/")
@@ -26,19 +40,4 @@ def lambda_handler(event, context):
if __name__ == "__main__":
- print(
- app.get_openapi_json_schema(
- title="My API",
- security_schemes={
- "oauth": OAuth2(
- flows=OAuthFlows(
- authorizationCode=OAuthFlowAuthorizationCode(
- authorizationUrl="https://xxx.amazoncognito.com/oauth2/authorize",
- tokenUrl="https://xxx.amazoncognito.com/oauth2/token",
- ),
- ),
- ),
- },
- security=[{"oauth": ["admin"]}], # (1)!
- ),
- )
+ print(app.get_openapi_json_schema())
diff --git a/examples/event_handler_rest/src/security_schemes_global_and_optional.py b/examples/event_handler_rest/src/security_schemes_global_and_optional.py
index 2a890efd5e4..84e5b0fdfcd 100644
--- a/examples/event_handler_rest/src/security_schemes_global_and_optional.py
+++ b/examples/event_handler_rest/src/security_schemes_global_and_optional.py
@@ -12,6 +12,19 @@
logger = Logger()
app = APIGatewayRestResolver(enable_validation=True)
+app.configure_openapi(
+ title="My API",
+ security_schemes={
+ "oauth": OAuth2(
+ flows=OAuthFlows(
+ authorizationCode=OAuthFlowAuthorizationCode(
+ authorizationUrl="https://xxx.amazoncognito.com/oauth2/authorize",
+ tokenUrl="https://xxx.amazoncognito.com/oauth2/token",
+ ),
+ ),
+ ),
+ },
+)
@app.get("/protected", security=[{"oauth": ["admin"]}])
@@ -31,18 +44,4 @@ def lambda_handler(event, context):
if __name__ == "__main__":
- print(
- app.get_openapi_json_schema(
- title="My API",
- security_schemes={
- "oauth": OAuth2(
- flows=OAuthFlows(
- authorizationCode=OAuthFlowAuthorizationCode(
- authorizationUrl="https://xxx.amazoncognito.com/oauth2/authorize",
- tokenUrl="https://xxx.amazoncognito.com/oauth2/token",
- ),
- ),
- ),
- },
- ),
- )
+ print(app.get_openapi_json_schema())
diff --git a/examples/event_handler_rest/src/security_schemes_per_operation.py b/examples/event_handler_rest/src/security_schemes_per_operation.py
index 66770a787c7..04b5a4ba830 100644
--- a/examples/event_handler_rest/src/security_schemes_per_operation.py
+++ b/examples/event_handler_rest/src/security_schemes_per_operation.py
@@ -12,6 +12,19 @@
logger = Logger()
app = APIGatewayRestResolver(enable_validation=True)
+app.configure_openapi(
+ title="My API",
+ security_schemes={
+ "oauth": OAuth2(
+ flows=OAuthFlows(
+ authorizationCode=OAuthFlowAuthorizationCode(
+ authorizationUrl="https://xxx.amazoncognito.com/oauth2/authorize",
+ tokenUrl="https://xxx.amazoncognito.com/oauth2/token",
+ ),
+ ),
+ ),
+ },
+)
@app.get("/", security=[{"oauth": ["admin"]}]) # (1)!
@@ -26,18 +39,4 @@ def lambda_handler(event, context):
if __name__ == "__main__":
- print(
- app.get_openapi_json_schema(
- title="My API",
- security_schemes={
- "oauth": OAuth2(
- flows=OAuthFlows(
- authorizationCode=OAuthFlowAuthorizationCode(
- authorizationUrl="https://xxx.amazoncognito.com/oauth2/authorize",
- tokenUrl="https://xxx.amazoncognito.com/oauth2/token",
- ),
- ),
- ),
- },
- ),
- )
+ print(app.get_openapi_json_schema())
diff --git a/examples/homepage/install/arm64/amplify.txt b/examples/homepage/install/arm64/amplify.txt
index 0ada8c000ab..50522ce7191 100644
--- a/examples/homepage/install/arm64/amplify.txt
+++ b/examples/homepage/install/arm64/amplify.txt
@@ -6,7 +6,7 @@
? Do you want to configure advanced settings? Yes
...
? Do you want to enable Lambda layers for this function? Yes
-? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9
+? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10
❯ amplify push -y
@@ -17,5 +17,5 @@ General information
- Name:
? Which setting do you want to update? Lambda layers configuration
? Do you want to enable Lambda layers for this function? Yes
-? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9
+? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10
? Do you want to edit the local lambda function now? No
diff --git a/examples/homepage/install/arm64/cdk_arm64.py b/examples/homepage/install/arm64/cdk_arm64.py
index cde4efa01ab..5b6e32a91a3 100644
--- a/examples/homepage/install/arm64/cdk_arm64.py
+++ b/examples/homepage/install/arm64/cdk_arm64.py
@@ -10,7 +10,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn(
self,
id="lambda-powertools",
- layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9",
+ layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10",
)
aws_lambda.Function(
self,
diff --git a/examples/homepage/install/arm64/pulumi_arm64.py b/examples/homepage/install/arm64/pulumi_arm64.py
index 956b45c020d..44dc354cc48 100644
--- a/examples/homepage/install/arm64/pulumi_arm64.py
+++ b/examples/homepage/install/arm64/pulumi_arm64.py
@@ -22,7 +22,7 @@
pulumi.Output.concat(
"arn:aws:lambda:",
aws.get_region_output().name,
- ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9",
+ ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10",
),
],
tracing_config={"mode": "Active"},
diff --git a/examples/homepage/install/arm64/sam.yaml b/examples/homepage/install/arm64/sam.yaml
index 0bcf5525071..3a4faa6ec82 100644
--- a/examples/homepage/install/arm64/sam.yaml
+++ b/examples/homepage/install/arm64/sam.yaml
@@ -9,4 +9,4 @@ Resources:
Runtime: python3.12
Handler: app.lambda_handler
Layers:
- - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9
+ - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10
diff --git a/examples/homepage/install/arm64/serverless.yml b/examples/homepage/install/arm64/serverless.yml
index 890b8d4b1f7..efd8de740b5 100644
--- a/examples/homepage/install/arm64/serverless.yml
+++ b/examples/homepage/install/arm64/serverless.yml
@@ -10,4 +10,4 @@ functions:
handler: lambda_function.lambda_handler
architecture: arm64
layers:
- - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9
+ - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10
diff --git a/examples/homepage/install/arm64/terraform.tf b/examples/homepage/install/arm64/terraform.tf
index 2b7ab8cf298..4e53e5a82a8 100644
--- a/examples/homepage/install/arm64/terraform.tf
+++ b/examples/homepage/install/arm64/terraform.tf
@@ -34,7 +34,7 @@ resource "aws_lambda_function" "test_lambda" {
role = aws_iam_role.iam_for_lambda.arn
handler = "index.test"
runtime = "python3.12"
- layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:9"]
+ layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-arm64:10"]
architectures = ["arm64"]
source_code_hash = filebase64sha256("lambda_function_payload.zip")
diff --git a/examples/homepage/install/x86_64/amplify.txt b/examples/homepage/install/x86_64/amplify.txt
index 5881bab630d..4d132029540 100644
--- a/examples/homepage/install/x86_64/amplify.txt
+++ b/examples/homepage/install/x86_64/amplify.txt
@@ -6,7 +6,7 @@
? Do you want to configure advanced settings? Yes
...
? Do you want to enable Lambda layers for this function? Yes
-? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9
+? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10
❯ amplify push -y
@@ -17,5 +17,5 @@ General information
- Name:
? Which setting do you want to update? Lambda layers configuration
? Do you want to enable Lambda layers for this function? Yes
-? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9
+? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:eu-central-1:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10
? Do you want to edit the local lambda function now? No
diff --git a/examples/homepage/install/x86_64/cdk_x86.py b/examples/homepage/install/x86_64/cdk_x86.py
index f4aa8b0fb3b..c74251216b6 100644
--- a/examples/homepage/install/x86_64/cdk_x86.py
+++ b/examples/homepage/install/x86_64/cdk_x86.py
@@ -10,7 +10,7 @@ def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
powertools_layer = aws_lambda.LayerVersion.from_layer_version_arn(
self,
id="lambda-powertools",
- layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9",
+ layer_version_arn=f"arn:aws:lambda:{Aws.REGION}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10",
)
aws_lambda.Function(
self,
diff --git a/examples/homepage/install/x86_64/pulumi_x86.py b/examples/homepage/install/x86_64/pulumi_x86.py
index b446867b2aa..a11c7fa5862 100644
--- a/examples/homepage/install/x86_64/pulumi_x86.py
+++ b/examples/homepage/install/x86_64/pulumi_x86.py
@@ -22,7 +22,7 @@
pulumi.Output.concat(
"arn:aws:lambda:",
aws.get_region_output().name,
- ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9",
+ ":017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10",
),
],
tracing_config={"mode": "Active"},
diff --git a/examples/homepage/install/x86_64/sam.yaml b/examples/homepage/install/x86_64/sam.yaml
index faaee1a2882..fa8089e8f84 100644
--- a/examples/homepage/install/x86_64/sam.yaml
+++ b/examples/homepage/install/x86_64/sam.yaml
@@ -8,4 +8,4 @@ Resources:
Runtime: python3.12
Handler: app.lambda_handler
Layers:
- - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9
+ - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10
diff --git a/examples/homepage/install/x86_64/serverless.yml b/examples/homepage/install/x86_64/serverless.yml
index 0d7ae2b957b..02da40e1fd5 100644
--- a/examples/homepage/install/x86_64/serverless.yml
+++ b/examples/homepage/install/x86_64/serverless.yml
@@ -10,4 +10,4 @@ functions:
handler: lambda_function.lambda_handler
architecture: arm64
layers:
- - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9
+ - arn:aws:lambda:${aws:region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10
diff --git a/examples/homepage/install/x86_64/terraform.tf b/examples/homepage/install/x86_64/terraform.tf
index f5342f7ab4d..aaedfd8d464 100644
--- a/examples/homepage/install/x86_64/terraform.tf
+++ b/examples/homepage/install/x86_64/terraform.tf
@@ -34,7 +34,7 @@ resource "aws_lambda_function" "test_lambda" {
role = aws_iam_role.iam_for_lambda.arn
handler = "index.test"
runtime = "python3.12"
- layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9"]
+ layers = ["arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10"]
source_code_hash = filebase64sha256("lambda_function_payload.zip")
}
diff --git a/examples/idempotency/tests/test_disabling_idempotency_utility.py b/examples/idempotency/tests/test_disabling_idempotency_utility.py
index f33174cde3d..3aba8a090c8 100644
--- a/examples/idempotency/tests/test_disabling_idempotency_utility.py
+++ b/examples/idempotency/tests/test_disabling_idempotency_utility.py
@@ -4,22 +4,23 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
- aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
+ aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+ def get_remaining_time_in_millis(self) -> int:
+ return 5
- def get_remaining_time_in_millis(self) -> int:
- return 5
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
-def test_idempotent_lambda_handler(monkeypatch, lambda_context):
+def test_idempotent_lambda_handler(monkeypatch, lambda_context: LambdaContext):
# Set POWERTOOLS_IDEMPOTENCY_DISABLED before calling decorated functions
monkeypatch.setenv("POWERTOOLS_IDEMPOTENCY_DISABLED", 1)
diff --git a/examples/idempotency/tests/test_with_dynamodb_local.py b/examples/idempotency/tests/test_with_dynamodb_local.py
index 7a9a8fc0234..bf684d41292 100644
--- a/examples/idempotency/tests/test_with_dynamodb_local.py
+++ b/examples/idempotency/tests/test_with_dynamodb_local.py
@@ -5,18 +5,19 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
- aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
+ aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+ def get_remaining_time_in_millis(self) -> int:
+ return 5
- def get_remaining_time_in_millis(self) -> int:
- return 5
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/examples/idempotency/tests/test_with_io_operations.py b/examples/idempotency/tests/test_with_io_operations.py
index 9d455906889..3a620827d32 100644
--- a/examples/idempotency/tests/test_with_io_operations.py
+++ b/examples/idempotency/tests/test_with_io_operations.py
@@ -5,18 +5,19 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
- aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
+ aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+ def get_remaining_time_in_millis(self) -> int:
+ return 5
- def get_remaining_time_in_millis(self) -> int:
- return 5
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/examples/logger/sam/template.yaml b/examples/logger/sam/template.yaml
index b024a0ba825..1411ec0f1b8 100644
--- a/examples/logger/sam/template.yaml
+++ b/examples/logger/sam/template.yaml
@@ -14,7 +14,7 @@ Globals:
Layers:
# Find the latest Layer version in the official documentation
# https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer
- - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9
+ - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10
Resources:
LoggerLambdaHandlerExample:
diff --git a/examples/logger/src/fake_lambda_context_for_logger.py b/examples/logger/src/fake_lambda_context_for_logger.py
index d3b3efc98f9..bf608530c48 100644
--- a/examples/logger/src/fake_lambda_context_for_logger.py
+++ b/examples/logger/src/fake_lambda_context_for_logger.py
@@ -4,15 +4,16 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
- aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
+ aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/examples/metrics/sam/template.yaml b/examples/metrics/sam/template.yaml
index 57d0776211d..4780b101928 100644
--- a/examples/metrics/sam/template.yaml
+++ b/examples/metrics/sam/template.yaml
@@ -11,11 +11,12 @@ Globals:
Variables:
POWERTOOLS_SERVICE_NAME: booking
POWERTOOLS_METRICS_NAMESPACE: ServerlessAirline
+ POWERTOOLS_METRICS_FUNCTION_NAME: my-function-name
Layers:
# Find the latest Layer version in the official documentation
# https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer
- - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9
+ - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10
Resources:
CaptureLambdaHandlerExample:
diff --git a/examples/metrics/src/assert_multiple_emf_blobs.py b/examples/metrics/src/assert_multiple_emf_blobs.py
index 6ed89460788..9c813632bf5 100644
--- a/examples/metrics/src/assert_multiple_emf_blobs.py
+++ b/examples/metrics/src/assert_multiple_emf_blobs.py
@@ -5,15 +5,16 @@
import pytest
-@pytest.fixture
-def lambda_context():
- @dataclass
- class LambdaContext:
- function_name: str = "test"
- memory_limit_in_mb: int = 128
- invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
- aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+@dataclass
+class LambdaContext:
+ function_name: str = "test"
+ memory_limit_in_mb: int = 128
+ invoked_function_arn: str = "arn:aws:lambda:eu-west-1:809313241:function:test"
+ aws_request_id: str = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
@@ -21,7 +22,7 @@ def capture_metrics_output_multiple_emf_objects(capsys):
return [json.loads(line.strip()) for line in capsys.readouterr().out.split("\n") if line]
-def test_log_metrics(capsys, lambda_context):
+def test_log_metrics(capsys, lambda_context: LambdaContext):
assert_multiple_emf_blobs_module.lambda_handler({}, lambda_context)
cold_start_blob, custom_metrics_blob = capture_metrics_output_multiple_emf_objects(capsys)
diff --git a/examples/metrics/src/working_with_custom_cold_start_function_name.py b/examples/metrics/src/working_with_custom_cold_start_function_name.py
new file mode 100644
index 00000000000..6d81deb3fa2
--- /dev/null
+++ b/examples/metrics/src/working_with_custom_cold_start_function_name.py
@@ -0,0 +1,8 @@
+from aws_lambda_powertools import Metrics
+from aws_lambda_powertools.utilities.typing import LambdaContext
+
+metrics = Metrics(function_name="my-function-name")
+
+
+@metrics.log_metrics(capture_cold_start_metric=True)
+def lambda_handler(event: dict, context: LambdaContext): ...
diff --git a/examples/metrics_datadog/sam/template.yaml b/examples/metrics_datadog/sam/template.yaml
index f74cdce5e82..38b0412ae52 100644
--- a/examples/metrics_datadog/sam/template.yaml
+++ b/examples/metrics_datadog/sam/template.yaml
@@ -20,7 +20,7 @@ Globals:
Layers:
# Find the latest Layer version in the official documentation
# https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer
- - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9
+ - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10
# Find the latest Layer version in the Datadog official documentation
# Datadog SDK
diff --git a/examples/tracer/sam/template.yaml b/examples/tracer/sam/template.yaml
index 5ec75c861ec..e1a10a0c1d3 100644
--- a/examples/tracer/sam/template.yaml
+++ b/examples/tracer/sam/template.yaml
@@ -13,7 +13,7 @@ Globals:
Layers:
# Find the latest Layer version in the official documentation
# https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer
- - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:9
+ - !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3-python312-x86_64:10
Resources:
CaptureLambdaHandlerExample:
diff --git a/noxfile.py b/noxfile.py
index c1d06798b88..439ef5895d2 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -80,6 +80,7 @@ def test_with_datadog_as_required_package(session: nox.Session):
folders=[
f"{PREFIX_TESTS_FUNCTIONAL}/metrics/datadog/",
],
+ extras="datadog,aws-sdk", # Datadog library requires boto3
)
diff --git a/package-lock.json b/package-lock.json
index b8c46f3e229..f48b34402d3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,13 +11,13 @@
"package-lock.json": "^1.0.0"
},
"devDependencies": {
- "aws-cdk": "^2.1003.0"
+ "aws-cdk": "^2.1005.0"
}
},
"node_modules/aws-cdk": {
- "version": "2.1003.0",
- "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1003.0.tgz",
- "integrity": "sha512-FORPDGW8oUg4tXFlhX+lv/j+152LO9wwi3/CwNr1WY3c3HwJUtc0fZGb2B3+Fzy6NhLWGHJclUsJPEhjEt8Nhg==",
+ "version": "2.1005.0",
+ "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1005.0.tgz",
+ "integrity": "sha512-4ejfGGrGCEl0pg1xcqkxK0lpBEZqNI48wtrXhk6dYOFYPYMZtqn1kdla29ONN+eO2unewkNF4nLP1lPYhlf9Pg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
diff --git a/package.json b/package.json
index 837ae3f1d4e..f955266a72c 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "aws-lambda-powertools-python-e2e",
"version": "1.0.0",
"devDependencies": {
- "aws-cdk": "^2.1003.0"
+ "aws-cdk": "^2.1005.0"
},
"dependencies": {
"package-lock.json": "^1.0.0"
diff --git a/poetry.lock b/poetry.lock
index 1b73fac2b69..9f4c160c335 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -15,14 +15,14 @@ markers = {main = "extra == \"all\" or extra == \"parser\""}
[[package]]
name = "anyio"
-version = "4.8.0"
+version = "4.9.0"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
- {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
+ {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"},
+ {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"},
]
[package.dependencies]
@@ -32,8 +32,8 @@ sniffio = ">=1.1"
typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""}
[package.extras]
-doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"]
-test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""]
+doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"]
+test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""]
trio = ["trio (>=0.26.1)"]
[[package]]
@@ -50,14 +50,14 @@ files = [
[[package]]
name = "argcomplete"
-version = "3.5.3"
+version = "3.6.0"
description = "Bash tab completion for argparse"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "argcomplete-3.5.3-py3-none-any.whl", hash = "sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61"},
- {file = "argcomplete-3.5.3.tar.gz", hash = "sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392"},
+ {file = "argcomplete-3.6.0-py3-none-any.whl", hash = "sha256:4e3e4e10beb20e06444dbac0ac8dda650cb6349caeefe980208d3c548708bedd"},
+ {file = "argcomplete-3.6.0.tar.gz", hash = "sha256:2e4e42ec0ba2fff54b0d244d0b1623e86057673e57bafe72dda59c64bd5dee8b"},
]
[package.extras]
@@ -99,18 +99,18 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle ; platform_python_implementat
[[package]]
name = "aws-cdk-asset-awscli-v1"
-version = "2.2.221"
+version = "2.2.228"
description = "A library that contains the AWS CLI for use in Lambda Layers"
optional = false
-python-versions = "~=3.8"
+python-versions = "~=3.9"
groups = ["dev"]
files = [
- {file = "aws_cdk.asset_awscli_v1-2.2.221-py3-none-any.whl", hash = "sha256:66a83e4116b6a7a0041f99f7bca7d0ea354c9ab2e17a938a3dcec50f7272f5d9"},
- {file = "aws_cdk_asset_awscli_v1-2.2.221.tar.gz", hash = "sha256:7ea0366c8090dc396fed85baddbcf48ac4a088c1bf606cd776138e6526679108"},
+ {file = "aws_cdk.asset_awscli_v1-2.2.228-py3-none-any.whl", hash = "sha256:a79a76948a32e672c5f0743384c5abea14ee8b802b4a080f63a1f310fd7d5861"},
+ {file = "aws_cdk_asset_awscli_v1-2.2.228.tar.gz", hash = "sha256:65def76adc852eb9fdab16ebe1b9193ce9892546fdb13ab0d0c3211c220887cc"},
]
[package.dependencies]
-jsii = ">=1.106.0,<2.0.0"
+jsii = ">=1.109.0,<2.0.0"
publication = ">=0.0.3"
typeguard = ">=2.13.3,<4.3.0"
@@ -211,20 +211,20 @@ typeguard = ">=2.13.3,<2.14.0"
[[package]]
name = "aws-cdk-aws-lambda-python-alpha"
-version = "2.182.0a0"
+version = "2.185.0a0"
description = "The CDK Construct Library for AWS Lambda in Python"
optional = false
-python-versions = "~=3.8"
+python-versions = "~=3.9"
groups = ["dev"]
files = [
- {file = "aws_cdk.aws_lambda_python_alpha-2.182.0a0-py3-none-any.whl", hash = "sha256:636d5c667582c454da012234e241b973824280d2edf412d5ba469d6d571045c6"},
- {file = "aws_cdk_aws_lambda_python_alpha-2.182.0a0.tar.gz", hash = "sha256:0edadadb817209ba1b541eb6508422b53753bbd853338f3b33b444fe0866d6b1"},
+ {file = "aws_cdk.aws_lambda_python_alpha-2.185.0a0-py3-none-any.whl", hash = "sha256:e6146d8af18d045c7ab1ff39bd4769ad9f8d52a2d44c73d74df817fb2fda5c85"},
+ {file = "aws_cdk_aws_lambda_python_alpha-2.185.0a0.tar.gz", hash = "sha256:f85f8c0ed51b6e09acb45ac28efcf65225517d5b0b05ff3d2cf583429823b5b6"},
]
[package.dependencies]
-aws-cdk-lib = ">=2.182.0,<3.0.0"
+aws-cdk-lib = ">=2.185.0,<3.0.0"
constructs = ">=10.0.0,<11.0.0"
-jsii = ">=1.106.0,<2.0.0"
+jsii = ">=1.109.0,<2.0.0"
publication = ">=0.0.3"
typeguard = ">=2.13.3,<4.3.0"
@@ -247,22 +247,22 @@ typeguard = ">=2.13.3,<4.3.0"
[[package]]
name = "aws-cdk-lib"
-version = "2.182.0"
+version = "2.185.0"
description = "Version 2 of the AWS Cloud Development Kit library"
optional = false
-python-versions = "~=3.8"
+python-versions = "~=3.9"
groups = ["dev"]
files = [
- {file = "aws_cdk_lib-2.182.0-py3-none-any.whl", hash = "sha256:73b46fb789c7fe138f5ec15afa23c588fee706827edd056dd5fa8571e3d725dd"},
- {file = "aws_cdk_lib-2.182.0.tar.gz", hash = "sha256:907a2969d7c48605f597b47e47adb0b58ac17bb8de71d4a97761513c76cb3aa8"},
+ {file = "aws_cdk_lib-2.185.0-py3-none-any.whl", hash = "sha256:e58db294db7265962a7122319b708fce1815e0e5b46451d93bac9789ad33a798"},
+ {file = "aws_cdk_lib-2.185.0.tar.gz", hash = "sha256:d96216f444d9560e4f8b0cfd7f25b84c66b8570a264bead8142f40261425e24e"},
]
[package.dependencies]
-"aws-cdk.asset-awscli-v1" = ">=2.2.208,<3.0.0"
+"aws-cdk.asset-awscli-v1" = ">=2.2.227,<3.0.0"
"aws-cdk.asset-node-proxy-agent-v6" = ">=2.1.0,<3.0.0"
-"aws-cdk.cloud-assembly-schema" = ">=40.6.0,<41.0.0"
+"aws-cdk.cloud-assembly-schema" = ">=40.7.0,<41.0.0"
constructs = ">=10.0.0,<11.0.0"
-jsii = ">=1.106.0,<2.0.0"
+jsii = ">=1.109.0,<2.0.0"
publication = ">=0.0.3"
typeguard = ">=2.13.3,<4.3.0"
@@ -305,14 +305,14 @@ requests = ">=0.14.0"
[[package]]
name = "aws-sam-translator"
-version = "1.94.0"
+version = "1.95.0"
description = "AWS SAM Translator is a library that transform SAM templates into AWS CloudFormation templates"
optional = false
python-versions = "!=4.0,<=4.0,>=3.8"
groups = ["dev"]
files = [
- {file = "aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539"},
- {file = "aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391"},
+ {file = "aws_sam_translator-1.95.0-py3-none-any.whl", hash = "sha256:c9e0f22cbe83c768f7d20a3afb7e654bd6bfc087b387528bd48e98366b82ae40"},
+ {file = "aws_sam_translator-1.95.0.tar.gz", hash = "sha256:fd2b891fc4cbdde1e06130eaf2710de5cc74442a656b7859b3840691144494cf"},
]
[package.dependencies]
@@ -343,18 +343,18 @@ wrapt = "*"
[[package]]
name = "babel"
-version = "2.16.0"
+version = "2.17.0"
description = "Internationalization utilities"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"},
- {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"},
+ {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"},
+ {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"},
]
[package.extras]
-dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
+dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""]
[[package]]
name = "backrefs"
@@ -449,18 +449,18 @@ uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "boto3"
-version = "1.36.10"
+version = "1.37.14"
description = "The AWS SDK for Python"
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
- {file = "boto3-1.36.10-py3-none-any.whl", hash = "sha256:5f8d5c2024a2d1411d3d67abb7357ec7d4c6162e3f1c396dc9b79d042cfd0a80"},
- {file = "boto3-1.36.10.tar.gz", hash = "sha256:d2f1010db699326b26fbd465d91c4b49177c9d995d7e72c0f31335f139efa0d2"},
+ {file = "boto3-1.37.14-py3-none-any.whl", hash = "sha256:56b4d1e084dbca43d5fdd070f633a84de61a6ce592655b4d239d263d1a0097fc"},
+ {file = "boto3-1.37.14.tar.gz", hash = "sha256:cf2e5e6d56efd5850db8ce3d9094132e4759cf2d4b5fd8200d69456bf61a20f3"},
]
[package.dependencies]
-botocore = ">=1.36.10,<1.37.0"
+botocore = ">=1.37.14,<1.38.0"
jmespath = ">=0.7.1,<2.0.0"
s3transfer = ">=0.11.0,<0.12.0"
@@ -469,14 +469,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
[[package]]
name = "boto3-stubs"
-version = "1.37.7"
-description = "Type annotations for boto3 1.37.7 generated with mypy-boto3-builder 8.10.0"
+version = "1.37.19"
+description = "Type annotations for boto3 1.37.19 generated with mypy-boto3-builder 8.10.1"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "boto3_stubs-1.37.7-py3-none-any.whl", hash = "sha256:c13fe07863d3dd36c3eeae17ed1e0fab92400963ab7c63c24b017ea943eb6879"},
- {file = "boto3_stubs-1.37.7.tar.gz", hash = "sha256:6caafddb692af0d3fd850cb053528219f5e8f9e959ec6fe99ae3f69bbd7c2577"},
+ {file = "boto3_stubs-1.37.19-py3-none-any.whl", hash = "sha256:af67bca13956004eaab81a7af179c689392fd8341f761a27d5b49cd17639a472"},
+ {file = "boto3_stubs-1.37.19.tar.gz", hash = "sha256:95c665b1375b6578067fdc3a7854b58eca710b288240bd1cd2c9b1954e3f5f5d"},
]
[package.dependencies]
@@ -543,7 +543,7 @@ bedrock-data-automation-runtime = ["mypy-boto3-bedrock-data-automation-runtime (
bedrock-runtime = ["mypy-boto3-bedrock-runtime (>=1.37.0,<1.38.0)"]
billing = ["mypy-boto3-billing (>=1.37.0,<1.38.0)"]
billingconductor = ["mypy-boto3-billingconductor (>=1.37.0,<1.38.0)"]
-boto3 = ["boto3 (==1.37.7)"]
+boto3 = ["boto3 (==1.37.19)"]
braket = ["mypy-boto3-braket (>=1.37.0,<1.38.0)"]
budgets = ["mypy-boto3-budgets (>=1.37.0,<1.38.0)"]
ce = ["mypy-boto3-ce (>=1.37.0,<1.38.0)"]
@@ -907,14 +907,14 @@ xray = ["mypy-boto3-xray (>=1.37.0,<1.38.0)"]
[[package]]
name = "botocore"
-version = "1.36.10"
+version = "1.37.14"
description = "Low-level, data-driven core of boto 3."
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
- {file = "botocore-1.36.10-py3-none-any.whl", hash = "sha256:45c8a6e01dc18d44a13ba688f1d60ad562db8154b08c46b412387ea040a741c2"},
- {file = "botocore-1.36.10.tar.gz", hash = "sha256:d27bb73f0ea81395527a6298ac0a7ea5b2958094169f7cf7d48e3f4e4bc21b65"},
+ {file = "botocore-1.37.14-py3-none-any.whl", hash = "sha256:709a1796f436f8e378e52170e58501c1f3b5f2d1308238cf1d6a3bdba2e32851"},
+ {file = "botocore-1.37.14.tar.gz", hash = "sha256:b0adce3f0fb42b914eb05079f50cf368cb9cf9745fdd206bd91fe6ac67b29aca"},
]
[package.dependencies]
@@ -930,14 +930,14 @@ crt = ["awscrt (==0.23.8)"]
[[package]]
name = "botocore-stubs"
-version = "1.36.9"
+version = "1.37.14"
description = "Type annotations and code completion for botocore"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "botocore_stubs-1.36.9-py3-none-any.whl", hash = "sha256:76fc0651fc4e7d9a83de944d109f4d779a064265c5f243699718e1d06104efd9"},
- {file = "botocore_stubs-1.36.9.tar.gz", hash = "sha256:786857fc9f4e11f16b62e0383b8d60a3a03a9ac10fe23d57d1fa726e77626535"},
+ {file = "botocore_stubs-1.37.14-py3-none-any.whl", hash = "sha256:2af28b15e379318a55f2e31cd43f4ccec87ec28ac6d19f3c692ee606bc9e82a3"},
+ {file = "botocore_stubs-1.37.14.tar.gz", hash = "sha256:02c64f36f5be8828cf0e9c7e954088e4e1c0beda2d0f5e0c5d3d5f09ab974a3c"},
]
[package.dependencies]
@@ -950,10 +950,9 @@ botocore = ["botocore"]
name = "bytecode"
version = "0.16.1"
description = "Python module to generate and modify bytecode"
-optional = true
+optional = false
python-versions = ">=3.8"
-groups = ["main"]
-markers = "extra == \"datadog\""
+groups = ["main", "dev"]
files = [
{file = "bytecode-0.16.1-py3-none-any.whl", hash = "sha256:1d4b61ed6bade4bff44127c8283bef8131a664ce4dbe09d64a88caf329939f35"},
{file = "bytecode-0.16.1.tar.gz", hash = "sha256:8fbbb637c880f339e564858bc6c7984ede67ae97bc71343379a535a9a4baf398"},
@@ -991,53 +990,53 @@ ujson = ["ujson (>=5.7.0)"]
[[package]]
name = "cdk-nag"
-version = "2.35.35"
+version = "2.35.48"
description = "Check CDK v2 applications for best practices using a combination on available rule packs."
optional = false
-python-versions = "~=3.8"
+python-versions = "~=3.9"
groups = ["dev"]
files = [
- {file = "cdk_nag-2.35.35-py3-none-any.whl", hash = "sha256:64afea66f093063b8c28566bb479734265d141277c0808ee6964820dd1fe8e69"},
- {file = "cdk_nag-2.35.35.tar.gz", hash = "sha256:1722e6bc0b710275f66af7ceb969b258c39140cb30da877331c9aa34187ba608"},
+ {file = "cdk_nag-2.35.48-py3-none-any.whl", hash = "sha256:b90c94f2007f2ca9ce30ee85629a5fa2130f7e5cc89327a195049c255e7919f2"},
+ {file = "cdk_nag-2.35.48.tar.gz", hash = "sha256:6d1804b4770c2aed60dcbbaae87aff795e558b304acfa1d3d2c9161b2cfc7580"},
]
[package.dependencies]
aws-cdk-lib = ">=2.156.0,<3.0.0"
constructs = ">=10.0.5,<11.0.0"
-jsii = ">=1.108.0,<2.0.0"
+jsii = ">=1.109.0,<2.0.0"
publication = ">=0.0.3"
typeguard = ">=2.13.3,<4.3.0"
[[package]]
name = "cdklabs-generative-ai-cdk-constructs"
-version = "0.1.295"
+version = "0.1.298"
description = "AWS Generative AI CDK Constructs is a library for well-architected generative AI patterns."
optional = false
-python-versions = "~=3.8"
+python-versions = "~=3.9"
groups = ["dev"]
files = [
- {file = "cdklabs.generative_ai_cdk_constructs-0.1.295-py3-none-any.whl", hash = "sha256:dcef3a050e8a0ac0cd355b2c6c9fc607089a8f7455d2659be95e4ea1e90d9dd2"},
- {file = "cdklabs_generative_ai_cdk_constructs-0.1.295.tar.gz", hash = "sha256:cb1b28aacb604c85bbc99223244dabe420b9380d6295a6ca4667e52dc8c28fd4"},
+ {file = "cdklabs.generative_ai_cdk_constructs-0.1.298-py3-none-any.whl", hash = "sha256:a4ae2cd3bc6c5ebf1bf314ef9bedde448170f05f4945097176f72b3b24f48040"},
+ {file = "cdklabs_generative_ai_cdk_constructs-0.1.298.tar.gz", hash = "sha256:43d10f42ea5c79b5ce5b79412cf580929a8a08be78c28acbe527c4d45ec2176a"},
]
[package.dependencies]
aws-cdk-lib = ">=2.181.1,<3.0.0"
-cdk-nag = ">=2.35.35,<3.0.0"
+cdk-nag = ">=2.35.46,<3.0.0"
constructs = ">=10.3.0,<11.0.0"
-jsii = ">=1.108.0,<2.0.0"
+jsii = ">=1.109.0,<2.0.0"
publication = ">=0.0.3"
typeguard = ">=2.13.3,<4.3.0"
[[package]]
name = "certifi"
-version = "2024.12.14"
+version = "2025.1.31"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.6"
groups = ["main", "dev"]
files = [
- {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
- {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
+ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
+ {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
]
[[package]]
@@ -1123,18 +1122,18 @@ pycparser = "*"
[[package]]
name = "cfn-lint"
-version = "1.28.0"
+version = "1.32.0"
description = "Checks CloudFormation templates for practices and behaviour that could potentially be improved"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "cfn_lint-1.28.0-py3-none-any.whl", hash = "sha256:e33a48227462f3304e01683d596a31523a638fe342d417a170344f57c0ee80e0"},
- {file = "cfn_lint-1.28.0.tar.gz", hash = "sha256:5ba44c441d69dcf8f78cd0b5ebe4a6fcd55c0073d2d21af62e4201825b175c2a"},
+ {file = "cfn_lint-1.32.0-py3-none-any.whl", hash = "sha256:b3e8cae8b37ef6794efa6cd747f3398a8c8f4dc4d39d69b068be2fec277545a2"},
+ {file = "cfn_lint-1.32.0.tar.gz", hash = "sha256:1289184aaca0275dd62638598fd07c6f01023fa6a37d966b3b6f089e30a3d194"},
]
[package.dependencies]
-aws-sam-translator = ">=1.94.0"
+aws-sam-translator = ">=1.95.0"
jsonpatch = "*"
networkx = ">=2.4,<4"
pyyaml = ">5.4"
@@ -1314,75 +1313,75 @@ typeguard = ">=2.13.3,<2.14.0"
[[package]]
name = "coverage"
-version = "7.6.12"
+version = "7.7.1"
description = "Code coverage measurement for Python"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "coverage-7.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8"},
- {file = "coverage-7.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879"},
- {file = "coverage-7.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe"},
- {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674"},
- {file = "coverage-7.6.12-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb"},
- {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c"},
- {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c"},
- {file = "coverage-7.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e"},
- {file = "coverage-7.6.12-cp310-cp310-win32.whl", hash = "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425"},
- {file = "coverage-7.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa"},
- {file = "coverage-7.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015"},
- {file = "coverage-7.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45"},
- {file = "coverage-7.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702"},
- {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0"},
- {file = "coverage-7.6.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f"},
- {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f"},
- {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d"},
- {file = "coverage-7.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba"},
- {file = "coverage-7.6.12-cp311-cp311-win32.whl", hash = "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f"},
- {file = "coverage-7.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558"},
- {file = "coverage-7.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad"},
- {file = "coverage-7.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3"},
- {file = "coverage-7.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574"},
- {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985"},
- {file = "coverage-7.6.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750"},
- {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea"},
- {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3"},
- {file = "coverage-7.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a"},
- {file = "coverage-7.6.12-cp312-cp312-win32.whl", hash = "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95"},
- {file = "coverage-7.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288"},
- {file = "coverage-7.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1"},
- {file = "coverage-7.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd"},
- {file = "coverage-7.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9"},
- {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e"},
- {file = "coverage-7.6.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4"},
- {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6"},
- {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3"},
- {file = "coverage-7.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc"},
- {file = "coverage-7.6.12-cp313-cp313-win32.whl", hash = "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3"},
- {file = "coverage-7.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef"},
- {file = "coverage-7.6.12-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e"},
- {file = "coverage-7.6.12-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703"},
- {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0"},
- {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924"},
- {file = "coverage-7.6.12-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b"},
- {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d"},
- {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827"},
- {file = "coverage-7.6.12-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9"},
- {file = "coverage-7.6.12-cp313-cp313t-win32.whl", hash = "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3"},
- {file = "coverage-7.6.12-cp313-cp313t-win_amd64.whl", hash = "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f"},
- {file = "coverage-7.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d"},
- {file = "coverage-7.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929"},
- {file = "coverage-7.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87"},
- {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c"},
- {file = "coverage-7.6.12-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2"},
- {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd"},
- {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73"},
- {file = "coverage-7.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86"},
- {file = "coverage-7.6.12-cp39-cp39-win32.whl", hash = "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31"},
- {file = "coverage-7.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57"},
- {file = "coverage-7.6.12-pp39.pp310-none-any.whl", hash = "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf"},
- {file = "coverage-7.6.12-py3-none-any.whl", hash = "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953"},
- {file = "coverage-7.6.12.tar.gz", hash = "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2"},
+ {file = "coverage-7.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:553ba93f8e3c70e1b0031e4dfea36aba4e2b51fe5770db35e99af8dc5c5a9dfe"},
+ {file = "coverage-7.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44683f2556a56c9a6e673b583763096b8efbd2df022b02995609cf8e64fc8ae0"},
+ {file = "coverage-7.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02fad4f8faa4153db76f9246bc95c1d99f054f4e0a884175bff9155cf4f856cb"},
+ {file = "coverage-7.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c181ceba2e6808ede1e964f7bdc77bd8c7eb62f202c63a48cc541e5ffffccb6"},
+ {file = "coverage-7.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b5b207a8b08c6a934b214e364cab2fa82663d4af18981a6c0a9e95f8df7602"},
+ {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:25fe40967717bad0ce628a0223f08a10d54c9d739e88c9cbb0f77b5959367542"},
+ {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:881cae0f9cbd928c9c001487bb3dcbfd0b0af3ef53ae92180878591053be0cb3"},
+ {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90e9141e9221dd6fbc16a2727a5703c19443a8d9bf7d634c792fa0287cee1ab"},
+ {file = "coverage-7.7.1-cp310-cp310-win32.whl", hash = "sha256:ae13ed5bf5542d7d4a0a42ff5160e07e84adc44eda65ddaa635c484ff8e55917"},
+ {file = "coverage-7.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:171e9977c6a5d2b2be9efc7df1126fd525ce7cad0eb9904fe692da007ba90d81"},
+ {file = "coverage-7.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1165490be0069e34e4f99d08e9c5209c463de11b471709dfae31e2a98cbd49fd"},
+ {file = "coverage-7.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:44af11c00fd3b19b8809487630f8a0039130d32363239dfd15238e6d37e41a48"},
+ {file = "coverage-7.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbba59022e7c20124d2f520842b75904c7b9f16c854233fa46575c69949fb5b9"},
+ {file = "coverage-7.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af94fb80e4f159f4d93fb411800448ad87b6039b0500849a403b73a0d36bb5ae"},
+ {file = "coverage-7.7.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae79f8e3501133aa0e220bbc29573910d096795882a70e6f6e6637b09522133"},
+ {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e33426a5e1dc7743dd54dfd11d3a6c02c5d127abfaa2edd80a6e352b58347d1a"},
+ {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b559adc22486937786731dac69e57296cb9aede7e2687dfc0d2696dbd3b1eb6b"},
+ {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b838a91e84e1773c3436f6cc6996e000ed3ca5721799e7789be18830fad009a2"},
+ {file = "coverage-7.7.1-cp311-cp311-win32.whl", hash = "sha256:2c492401bdb3a85824669d6a03f57b3dfadef0941b8541f035f83bbfc39d4282"},
+ {file = "coverage-7.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:1e6f867379fd033a0eeabb1be0cffa2bd660582b8b0c9478895c509d875a9d9e"},
+ {file = "coverage-7.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:eff187177d8016ff6addf789dcc421c3db0d014e4946c1cc3fbf697f7852459d"},
+ {file = "coverage-7.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2444fbe1ba1889e0b29eb4d11931afa88f92dc507b7248f45be372775b3cef4f"},
+ {file = "coverage-7.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177d837339883c541f8524683e227adcaea581eca6bb33823a2a1fdae4c988e1"},
+ {file = "coverage-7.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15d54ecef1582b1d3ec6049b20d3c1a07d5e7f85335d8a3b617c9960b4f807e0"},
+ {file = "coverage-7.7.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c82b27c56478d5e1391f2e7b2e7f588d093157fa40d53fd9453a471b1191f2"},
+ {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:315ff74b585110ac3b7ab631e89e769d294f303c6d21302a816b3554ed4c81af"},
+ {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4dd532dac197d68c478480edde74fd4476c6823355987fd31d01ad9aa1e5fb59"},
+ {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:385618003e3d608001676bb35dc67ae3ad44c75c0395d8de5780af7bb35be6b2"},
+ {file = "coverage-7.7.1-cp312-cp312-win32.whl", hash = "sha256:63306486fcb5a827449464f6211d2991f01dfa2965976018c9bab9d5e45a35c8"},
+ {file = "coverage-7.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:37351dc8123c154fa05b7579fdb126b9f8b1cf42fd6f79ddf19121b7bdd4aa04"},
+ {file = "coverage-7.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eebd927b86761a7068a06d3699fd6c20129becf15bb44282db085921ea0f1585"},
+ {file = "coverage-7.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a79c4a09765d18311c35975ad2eb1ac613c0401afdd9cb1ca4110aeb5dd3c4c"},
+ {file = "coverage-7.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b1c65a739447c5ddce5b96c0a388fd82e4bbdff7251396a70182b1d83631019"},
+ {file = "coverage-7.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392cc8fd2b1b010ca36840735e2a526fcbd76795a5d44006065e79868cc76ccf"},
+ {file = "coverage-7.7.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bb47cc9f07a59a451361a850cb06d20633e77a9118d05fd0f77b1864439461b"},
+ {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b4c144c129343416a49378e05c9451c34aae5ccf00221e4fa4f487db0816ee2f"},
+ {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bc96441c9d9ca12a790b5ae17d2fa6654da4b3962ea15e0eabb1b1caed094777"},
+ {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d03287eb03186256999539d98818c425c33546ab4901028c8fa933b62c35c3a"},
+ {file = "coverage-7.7.1-cp313-cp313-win32.whl", hash = "sha256:8fed429c26b99641dc1f3a79179860122b22745dd9af36f29b141e178925070a"},
+ {file = "coverage-7.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:092b134129a8bb940c08b2d9ceb4459af5fb3faea77888af63182e17d89e1cf1"},
+ {file = "coverage-7.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3154b369141c3169b8133973ac00f63fcf8d6dbcc297d788d36afbb7811e511"},
+ {file = "coverage-7.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:264ff2bcce27a7f455b64ac0dfe097680b65d9a1a293ef902675fa8158d20b24"},
+ {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba8480ebe401c2f094d10a8c4209b800a9b77215b6c796d16b6ecdf665048950"},
+ {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:520af84febb6bb54453e7fbb730afa58c7178fd018c398a8fcd8e269a79bf96d"},
+ {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d96127ae01ff571d465d4b0be25c123789cef88ba0879194d673fdea52f54e"},
+ {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0ce92c5a9d7007d838456f4b77ea159cb628187a137e1895331e530973dcf862"},
+ {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0dab4ef76d7b14f432057fdb7a0477e8bffca0ad39ace308be6e74864e632271"},
+ {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7e688010581dbac9cab72800e9076e16f7cccd0d89af5785b70daa11174e94de"},
+ {file = "coverage-7.7.1-cp313-cp313t-win32.whl", hash = "sha256:e52eb31ae3afacdacfe50705a15b75ded67935770c460d88c215a9c0c40d0e9c"},
+ {file = "coverage-7.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a6b6b3bd121ee2ec4bd35039319f3423d0be282b9752a5ae9f18724bc93ebe7c"},
+ {file = "coverage-7.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34a3bf6b92e6621fc4dcdaab353e173ccb0ca9e4bfbcf7e49a0134c86c9cd303"},
+ {file = "coverage-7.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d6874929d624d3a670f676efafbbc747f519a6121b581dd41d012109e70a5ebd"},
+ {file = "coverage-7.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5ff236c87a7b7aa1441a216caf44baee14cbfbd2256d306f926d16b026578"},
+ {file = "coverage-7.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452735fafe8ff5918236d5fe1feac322b359e57692269c75151f9b4ee4b7e1bc"},
+ {file = "coverage-7.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5f99a93cecf799738e211f9746dc83749b5693538fbfac279a61682ba309387"},
+ {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11dd6f52c2a7ce8bf0a5f3b6e4a8eb60e157ffedc3c4b4314a41c1dfbd26ce58"},
+ {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:b52edb940d087e2a96e73c1523284a2e94a4e66fa2ea1e2e64dddc67173bad94"},
+ {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d2e73e2ac468536197e6b3ab79bc4a5c9da0f078cd78cfcc7fe27cf5d1195ef0"},
+ {file = "coverage-7.7.1-cp39-cp39-win32.whl", hash = "sha256:18f544356bceef17cc55fcf859e5664f06946c1b68efcea6acdc50f8f6a6e776"},
+ {file = "coverage-7.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:d66ff48ab3bb6f762a153e29c0fc1eb5a62a260217bc64470d7ba602f5886d20"},
+ {file = "coverage-7.7.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:5b7b02e50d54be6114cc4f6a3222fec83164f7c42772ba03b520138859b5fde1"},
+ {file = "coverage-7.7.1-py3-none-any.whl", hash = "sha256:822fa99dd1ac686061e1219b67868e25d9757989cf2259f735a4802497d6da31"},
+ {file = "coverage-7.7.1.tar.gz", hash = "sha256:199a1272e642266b90c9f40dec7fd3d307b51bf639fa0d15980dc0b3246c1393"},
]
[package.dependencies]
@@ -1427,7 +1426,7 @@ files = [
{file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"},
{file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"},
]
-markers = {main = "extra == \"all\" or extra == \"datamasking\""}
+markers = {main = "python_version < \"3.10\" and (extra == \"all\" or extra == \"datamasking\")", dev = "python_version < \"3.10\""}
[package.dependencies]
cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""}
@@ -1442,14 +1441,72 @@ ssh = ["bcrypt (>=3.1.5)"]
test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
test-randomorder = ["pytest-randomly"]
+[[package]]
+name = "cryptography"
+version = "44.0.2"
+description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
+optional = false
+python-versions = "!=3.9.0,!=3.9.1,>=3.7"
+groups = ["main", "dev"]
+files = [
+ {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308"},
+ {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688"},
+ {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7"},
+ {file = "cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79"},
+ {file = "cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa"},
+ {file = "cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23"},
+ {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922"},
+ {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4"},
+ {file = "cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5"},
+ {file = "cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d"},
+ {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d"},
+ {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471"},
+ {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615"},
+ {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390"},
+ {file = "cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0"},
+]
+markers = {main = "python_version >= \"3.10\" and (extra == \"all\" or extra == \"datamasking\")", dev = "python_version >= \"3.10\""}
+
+[package.dependencies]
+cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""}
+
+[package.extras]
+docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""]
+docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"]
+nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""]
+pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"]
+sdist = ["build (>=1.0.0)"]
+ssh = ["bcrypt (>=3.1.5)"]
+test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
+test-randomorder = ["pytest-randomly"]
+
[[package]]
name = "datadog"
version = "0.51.0"
description = "The Datadog Python library"
-optional = true
+optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-groups = ["main"]
-markers = "extra == \"datadog\""
+groups = ["main", "dev"]
files = [
{file = "datadog-0.51.0-py2.py3-none-any.whl", hash = "sha256:a9764f091c96af4e0996d4400b168fc5fba380f911d6d672c9dcd4773e29ea3f"},
{file = "datadog-0.51.0.tar.gz", hash = "sha256:3279534f831ae0b4ae2d8ce42ef038b4ab38e667d7ed6ff7437982d7a0cf5250"},
@@ -1462,10 +1519,9 @@ requests = ">=2.6.0"
name = "datadog-lambda"
version = "6.106.0"
description = "The Datadog AWS Lambda Library"
-optional = true
+optional = false
python-versions = "<4,>=3.8.0"
-groups = ["main"]
-markers = "extra == \"datadog\""
+groups = ["main", "dev"]
files = [
{file = "datadog_lambda-6.106.0-py3-none-any.whl", hash = "sha256:0b648c4d16e11e3bc95536f41b26d6ca3a973217221b705bd0a40aece364eee2"},
{file = "datadog_lambda-6.106.0.tar.gz", hash = "sha256:17abb2a4f1fe803e54bc4b35a6977e3e873c290c38b4c963096e054052fd0eea"},
@@ -1482,91 +1538,81 @@ dev = ["boto3 (>=1.34.0,<2.0.0)", "flake8 (>=5.0.4,<6.0.0)", "pytest (>=8.0.0,<9
[[package]]
name = "ddtrace"
-version = "2.20.0"
+version = "3.2.1"
description = "Datadog APM client library"
-optional = true
-python-versions = ">=3.7"
-groups = ["main"]
-markers = "extra == \"datadog\""
-files = [
- {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:e1dee099099b95acf7d0e552179925cfec58a52315cc914d153506367b195bc4"},
- {file = "ddtrace-2.20.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:9d209bef14caafcd53be8c14e04741d86c08f76496c1bf755e2eaa38605ce3e0"},
- {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f37966012078151713d61382de2a7ed710a8f375820e0db41930436b813b651"},
- {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:879b963baf0b97d5ddd26185ab496b79efd25bbfdc2c25dbb1113ec19dc5abf9"},
- {file = "ddtrace-2.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e9b9a87c9df8a029fd3583ac660538dfa9d53207fee82b7f04749148bf8a3b"},
- {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:eb76547a4bbf285d03ffc6e065bbad61761954741da2df0e4683d68d46ef2159"},
- {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:194973afa1e357c68b6a6eceaabbddcef01130d167775126c2a15b3c1827f683"},
- {file = "ddtrace-2.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a71d2fc753b8fa2c3435b6f4d5f820d8deb51f49df59a4886b4da68b67f923d3"},
- {file = "ddtrace-2.20.0-cp310-cp310-win32.whl", hash = "sha256:567054d0c01dc552a8a24c4c9eeb98d778be720d2c4c9536acf1b86d6969a5e4"},
- {file = "ddtrace-2.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:d39f96e2fdfdf7ab43ee89a20d914f5ab12f8f361c390663eacb0e5da6e6e7fb"},
- {file = "ddtrace-2.20.0-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:0a1d7eaf6c9a5e0eabb8396f7d19faffc8f76a1ae37f34814c3432a9ca6f31da"},
- {file = "ddtrace-2.20.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:301a7787a34113b56cc9067a593c4717f6e158f2393883c30b59d0a37ebc06fa"},
- {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d76ce49eb42588766db6756240d746441a66f03932547bfca9c62a8aecdbb38"},
- {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a84d2e2411496c1b4ca3ce0cfb407d186cb3d13f1769c321fec30e677d815cd8"},
- {file = "ddtrace-2.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da47746a24242d805a800bca0a10b1354353e18b0bc4b6caf9c9c1724ba286b0"},
- {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6f89e6003a738800beeb9948c847366976c73de2e24cc469b644a125f418c0a8"},
- {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4fca20220bf668ebcac7051d28648b62aa95d2afeb5036ecad167cb454c7dcf1"},
- {file = "ddtrace-2.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1197e89fcaaca4ce419e3c812d04c73b8d16973202472cf3f674b4698b967697"},
- {file = "ddtrace-2.20.0-cp311-cp311-win32.whl", hash = "sha256:44bcd604a1d9095f4eb6813db6a677a208bd47884aff9ddc5aa46f596765f38e"},
- {file = "ddtrace-2.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:0a5f092df1ee4d0afe96502866ff0fb446a07c6a23d445ed616f1302c883e1d3"},
- {file = "ddtrace-2.20.0-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:f77103d36e6ab52cb45781766620d3874d0a728565afa7fd57f8ce2d5087e8e7"},
- {file = "ddtrace-2.20.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:d1cec952ce2ca9efbb34c8a9ee522e1cc588fe454b9115120b30fd5d0f821512"},
- {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4a1da150e92b6d43047f2a91a7d3b7133207f94b82613625abf82662359b30e"},
- {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91ab68c1facc6cf04085fdeea53210ed9928e95116809fd9bfe2dea54e83375d"},
- {file = "ddtrace-2.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fd7ec6410225e64ca875d1bc9bd6bd8489f52dd8558462fbb52447fb8f66ad3"},
- {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:57864590ddb84da4eb99332fe4b521e6fd747992178e3eabcf4f87406e908bb1"},
- {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:37693555704a0cbd4a925e4ffe9c6df696146c85557c5f66ce3a7a88406772d9"},
- {file = "ddtrace-2.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ae5e802aaefc0cd3b63e3fd46e051a39e9f960a02e89f44a5bb820f445b736f9"},
- {file = "ddtrace-2.20.0-cp312-cp312-win32.whl", hash = "sha256:14fe4f583bec105c40e233c74fcbaea185658651c626ce1609750d83d93a00ae"},
- {file = "ddtrace-2.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:cfbc926ddfeece0312e82f9e00a68001647666d11ceb050a5bbe66ca8931e3d2"},
- {file = "ddtrace-2.20.0-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:eeca6b6bd48794d48de438981dccbc96a06366edde798c12b2b3348ca5e03717"},
- {file = "ddtrace-2.20.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:3f526e75d1b61019db2cd715e8c7298325e21c3584f8677a7decf37aa81e7284"},
- {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96441189ccc772ef4871e23a35cec58a748c16ebfb2293eccaaa719dcbc368fd"},
- {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d31d769f222c9a5bde1d4a594da1341014bf02db1a7194f5a41ed7e5c4c9fa8"},
- {file = "ddtrace-2.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54068dbf034e1f607ef5d58a9fa1b26bd78b4f3db0618ce0a3e9c4b04fff7209"},
- {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62e86d9b00277fe2b9bdfbc51ca1bc34aa5c1200aa6bc5084c7eaaab28b022de"},
- {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c83c2458de1cf1bbac48689c6541a85d54ad94ae6608961e1089cc2959a8c77a"},
- {file = "ddtrace-2.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:569d7a92a88ba9b2a203addea688b0585901534c92c2d148ef9f971b6d7b3805"},
- {file = "ddtrace-2.20.0-cp37-cp37m-macosx_12_0_x86_64.whl", hash = "sha256:df413d646fc14b4be51a15ed8e484bcdf3b21e370e2644a586283bcc7e0b2355"},
- {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33e4406a436278722df193c93d49e662a8891e8a440fddb273dca9a56fa27947"},
- {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d358bc7b4b1daa2d6e6bc697244b39db653ddd5ae139045941d3db28950bfe"},
- {file = "ddtrace-2.20.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a523924382d2f8f87731e4ad86bbf4721fba9eb807ed3b0c862db6d768e1e81c"},
- {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:0af78a424e9d87250a8648a35b7de5653f27b3f6f6803c1b33780816a07e6d26"},
- {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:2723378e670d27927f7d1ab878c8668fc392a5656a66453b9808e7c4025431fd"},
- {file = "ddtrace-2.20.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01f76fc9bf1413a188ddd59851eb3b668d3de936afed73a5914a817f36e11005"},
- {file = "ddtrace-2.20.0-cp37-cp37m-win32.whl", hash = "sha256:3a615ae95ef8f889304b2958655ac8cda23cf2f2c8faf5d8ff88bd14bdcf3fb4"},
- {file = "ddtrace-2.20.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b90333661ffd3460bae6dbbd7a5f35d8467cff36bd7a689a47b014edb19c0fe6"},
- {file = "ddtrace-2.20.0-cp38-cp38-macosx_12_0_universal2.whl", hash = "sha256:ab27596e82bdfe9c0c5580f6886ec943ae2fe615a446c22470f6a1f9742dec62"},
- {file = "ddtrace-2.20.0-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:e2de7371291283cba1afdd7e919a577637099da0d6872d33b4008e1cad6e1b8b"},
- {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4f90f472768aef8ce023a924505c9d1d09428fc9d6ab81bc0e3ab183e3ff48"},
- {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05b68ba6fe4da5317396100669edf91b3d54b95ae979a2a22ca880cfcc6c249d"},
- {file = "ddtrace-2.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1512d07e6c7cde13ae251906d57d31613fe5ee99fab2894e90679053b4256953"},
- {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dcadc60aa60e11f2db56065a834aaa5e52a9be02e8edc8d14aa7015fb54092ce"},
- {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:698207d88941ea3e4e5f3add6071e6651caa12fcffe079359507391382251759"},
- {file = "ddtrace-2.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:9f95a251f84725df055202d933b4a8fb39cefd51341e10cad17d2a8b4d64700e"},
- {file = "ddtrace-2.20.0-cp38-cp38-win32.whl", hash = "sha256:0b121285459693ae9f3c9ce54cc4be981a2e73d4c52b8a5eb038cf41df9974dd"},
- {file = "ddtrace-2.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:4c840dc91c622138a4a6abdbcbee56897d4c55d9e7bf16b1902ee676f20b22f2"},
- {file = "ddtrace-2.20.0-cp39-cp39-macosx_12_0_universal2.whl", hash = "sha256:c74d69e6a4cbd91f6fe411519d753f34893d6d40a68829b43485690df8a7f30f"},
- {file = "ddtrace-2.20.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:4902b64ba89a8e4008228e7a5007e20b2bb8071c6c7689abd47dddc159e2baf1"},
- {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758ba828eddd144a4804af692869e7278376efa740932a7453e8fdc0ed6ef6a7"},
- {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:37995326df811236c9d92d1b5713378a7f11270bf1e21c64914653a3e12d7d01"},
- {file = "ddtrace-2.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab7f1babd7a8e73edf70c957a5b3bbeb4c615b232a078a0fe4da566e1663d1aa"},
- {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1cd1b240f465c98e226ab896b1b1c3696752d5eb1051a0aafb8a3db701d2ddc1"},
- {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3a300515c3327af4fd5c6c83e6ca63cd0a20e4243381d4b712e3f406d9ddf201"},
- {file = "ddtrace-2.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f1ce886b112e0e8aa66ba8cf3593f00f7f6ae6b48dd09bd8ce90c59adad59d66"},
- {file = "ddtrace-2.20.0-cp39-cp39-win32.whl", hash = "sha256:bb77464849b092f93839d5c257df9eaeb018521ddea2deef97dfc6e3501a2516"},
- {file = "ddtrace-2.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:b95f14f0634fe3f02dcebb7b8a124207b3d44168fd0dfc6bfff1e4db93978089"},
- {file = "ddtrace-2.20.0.tar.gz", hash = "sha256:f185c6dd88cd04884f0ad27b37f14d837274e8fc4dc43407781334d92d41c3bc"},
+optional = false
+python-versions = ">=3.8"
+groups = ["main", "dev"]
+files = [
+ {file = "ddtrace-3.2.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:912e5a824312861e877f6f976ab95c4eb01ab920cfaccc69c87dc5015309f6f4"},
+ {file = "ddtrace-3.2.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d54a2383e7db6f28f395b771270ecacdeba32315ddb39f3c256b554271a0a513"},
+ {file = "ddtrace-3.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d5b3eea2eb6e5c5e2956ea8706906fad72cd3bd270297396a91db940511b075"},
+ {file = "ddtrace-3.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:429e95ec0cae4a10b506c9a2d010eaa7f40a73086c58eca40bb51c640d25c9bb"},
+ {file = "ddtrace-3.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dec8fb650ad7b237706b1f16c76628eee7315b7820e5515c2844c3e2593005"},
+ {file = "ddtrace-3.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bdae569a745a38eb57003f8293056b2e9e736ca11753149b6b8b67c37ae74949"},
+ {file = "ddtrace-3.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d05d3745be16a92fba4fca9415376613c7e04f7dc47aaf6aaa4f9502e00e65cb"},
+ {file = "ddtrace-3.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b9b804dc73621e3cb867f6a6b03847d25c62798cdb1cca874fbfa4ce6e536105"},
+ {file = "ddtrace-3.2.1-cp310-cp310-win32.whl", hash = "sha256:994b02a566cbc33ed686ee03d23fea11741775096babe2b3a9b4fd8781cf65f6"},
+ {file = "ddtrace-3.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:d5c6c479841b0144017f3786197f0aa9bfb65bdc4d103a2e343aae8c0d065b5a"},
+ {file = "ddtrace-3.2.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c463262a5c2381dae3776f51a335310e2474deaf863997f4f0393ec2fcb6442"},
+ {file = "ddtrace-3.2.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:9669924ef069a9f85c424837d73fb13377fef67d2926e7f68f06fef4467f7352"},
+ {file = "ddtrace-3.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8d0d3a4dd0dcff2af95666235838af29eae8fd489df8938527ad7d5f40db93c"},
+ {file = "ddtrace-3.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:793da357c0121ee8b9203d776e577d55ff9dd5c1ec827fd669bcc35058d7278b"},
+ {file = "ddtrace-3.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7cd268fc09e7183e3457963a1534331fd838b890da827db7e5ef992e6bd5e96"},
+ {file = "ddtrace-3.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:62c3aef2b677299947fefb899b914158a4f3af63cefb6f7c4d9d2cf06865ce44"},
+ {file = "ddtrace-3.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:90c641c97ad10475723fd12c5708247c2a796a4ccd5a27195502993b3baeb513"},
+ {file = "ddtrace-3.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b3852a62155fe0cc500c7a633cb76d3c14bf53e96d9c3936a0d24a22cee22d03"},
+ {file = "ddtrace-3.2.1-cp311-cp311-win32.whl", hash = "sha256:78b6683c3d8cbb3d1048f6d7742b12749790abfd6a24ed07d35c61c171167617"},
+ {file = "ddtrace-3.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:e28337b86e0dcb4c2573248bcbc6706406a2fa496f772495609594f5a50e7003"},
+ {file = "ddtrace-3.2.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:316f31a4354ab92208b46ed46df9009726831982b072ed79d7f1f411ac6a10af"},
+ {file = "ddtrace-3.2.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:4ae996fbe7c1e3a345b9dce96a030801597fec14b8284574252b2c4dc45a802d"},
+ {file = "ddtrace-3.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa39e9587b81c5d342166b9b1b9ea6751954f89324111d52984d9e1cffca4e57"},
+ {file = "ddtrace-3.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2beda81f25dad61cb657188f92199c603ee3aef5d9a53a2bf24e4cf2620e699"},
+ {file = "ddtrace-3.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fd86d1d47a5f82bb2bda73d339ec434427c5fcb2d259f825d18b097fc2fa3e1"},
+ {file = "ddtrace-3.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2cd1febea180a494e67ae0388055f3aaa8f63cb090dcf1ce4c3054c2162e05d1"},
+ {file = "ddtrace-3.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f8964c3cf0c3ef8dd066323b4ed0fbe561ca56f4a0bbe591b5e8e65411cc955f"},
+ {file = "ddtrace-3.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6a8ca3d670f4c3a873f24fcfb25f9324193b361edb57bbeadc3b90257a3494c2"},
+ {file = "ddtrace-3.2.1-cp312-cp312-win32.whl", hash = "sha256:c9ffa96777be82566c990a30216aac00ff84b256d7d0a428ed4a63e4666b6c3e"},
+ {file = "ddtrace-3.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c2d6c34ed0f7986e9afbd8c991bb4e7049cc5631837708b400dd1c6b108058f9"},
+ {file = "ddtrace-3.2.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:8db2b0aa025ac50b1a4516bdd722ede4a0d70d7c31df7b4ca0842aadfacc8276"},
+ {file = "ddtrace-3.2.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:65715768745d609e88d77e7a843477dd8e08da382f6058672210c412924d83af"},
+ {file = "ddtrace-3.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:003b5de6e28224129e8ba103bd8de26e7571b8c5a9141fdc70f91ad4b15fb4a0"},
+ {file = "ddtrace-3.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28a05aaa595e763ce7c46a4d186da2314c795ed7311efe506a58760f77ce3d13"},
+ {file = "ddtrace-3.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530cdd0570c5a5c9df420924f992800e90fcb5f556c1a2cd6d83ee4c3356072d"},
+ {file = "ddtrace-3.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c38fa59a6e999c7a95c508f3dd020a74173c77ca19517a2257394d7b4329331f"},
+ {file = "ddtrace-3.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:92de3eed2d2a3ed58a75ad8f44c2897614b9c905dba26b0d29989f849069896e"},
+ {file = "ddtrace-3.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:157617ee0a8a7a7dd55c9e0e293c8a9f01bc0cbeddc8f36e61d2ce0e95a04be3"},
+ {file = "ddtrace-3.2.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:0f52367b665ae75d47c444f709b650c2457cd92c76171c03de76247654ac0d76"},
+ {file = "ddtrace-3.2.1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:d51d98b5714d9a02e6a919de211851170a829b88c407d1fb594dd0f72a241af3"},
+ {file = "ddtrace-3.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d47c042e5857c34d775858e0b1fde95bd4fe64b3dac27c7cb756fd593812077"},
+ {file = "ddtrace-3.2.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f73d78d58c2964c1073c4dc410edaa2de2d4a343878c19e06a4f14df3f1808d"},
+ {file = "ddtrace-3.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:752bd25994a191cc998029294f38b2355c76ad7c50a82705994695ac22a95675"},
+ {file = "ddtrace-3.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dadcdc75300961d70367ac21e3b7f3b43e1df27894c7be84e14e23be00d7edc4"},
+ {file = "ddtrace-3.2.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:125f286749493a4cd6785425adc944b0df82c96b8c540c8dba2769b5ef42dc7c"},
+ {file = "ddtrace-3.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c995c4e71db065a34d8a8657392180dded906ada73d33d0d5c8796070da1cbc"},
+ {file = "ddtrace-3.2.1-cp38-cp38-win32.whl", hash = "sha256:0d02456cf5839f33b78d66461cf0a6e8667669f9a440633687e4753f10505652"},
+ {file = "ddtrace-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:cd363d87fdbcd6ec4a4096e287d21a133758eea36abe7928558b4ab709cb33cc"},
+ {file = "ddtrace-3.2.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8c9e672d05b0a0f6519d42b50ff5a09f40d61dc9c93780896a3557dcca16e658"},
+ {file = "ddtrace-3.2.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:03b2fb551b55bb82f150b1ebe85956a54fe79e137ba34a5e9a6e15ae6ceb53a0"},
+ {file = "ddtrace-3.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2023770220a263f40684570293045f13ca6f664140ce88f53d4e3936e4fa661b"},
+ {file = "ddtrace-3.2.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4762448408b3365108c5636a947c018c494af7e69526a65046290df284b4ee96"},
+ {file = "ddtrace-3.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:347f21d1fef2884bbcfdf183406b25e5a8b26973ae15bf5b37d9461d6a229ea3"},
+ {file = "ddtrace-3.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:074abe5a3e887175e7fd3132531353279aeaa89cf113b7e9a75549bf7cc94e7a"},
+ {file = "ddtrace-3.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2b518df5d907a8427cd60007b5169cd649fc55c1f972dab3ebf6abfff757d3ed"},
+ {file = "ddtrace-3.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3a7a225953b991712aa57d8680063db5d078d9d11a1a3fc5c8bf2da0880f7717"},
+ {file = "ddtrace-3.2.1-cp39-cp39-win32.whl", hash = "sha256:76b44972e3d1201c88f56a56ec2ea46c4fb98735a92e2dab1957b694498a91a1"},
+ {file = "ddtrace-3.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:0877e52e46039f3a41a7e423f8b70d22635c66b397f33207a89897a598ed3228"},
+ {file = "ddtrace-3.2.1.tar.gz", hash = "sha256:d7fd33aa80131bc7cc619cd5bc63395c8ae2566aa49e5877d8d4295044b07ddd"},
]
[package.dependencies]
bytecode = [
{version = ">=0.16.0", markers = "python_version >= \"3.13.0\""},
- {version = ">=0.15.0", markers = "python_version ~= \"3.12.0\""},
+ {version = ">=0.15.1", markers = "python_version ~= \"3.12.0\""},
{version = ">=0.14.0", markers = "python_version ~= \"3.11.0\""},
{version = ">=0.13.0", markers = "python_version < \"3.11.0\""},
]
-envier = ">=0.5,<1.0"
+envier = ">=0.6.1,<0.7.0"
legacy-cgi = {version = ">=2.0.0", markers = "python_version >= \"3.13.0\""}
opentelemetry-api = ">=1"
protobuf = ">=3"
@@ -1580,24 +1626,23 @@ opentracing = ["opentracing (>=2.0.0)"]
[[package]]
name = "decorator"
-version = "5.1.1"
+version = "5.2.1"
description = "Decorators for Humans"
optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
- {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
+ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"},
+ {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"},
]
[[package]]
name = "deprecated"
version = "1.2.18"
description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
-optional = true
+optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
-groups = ["main"]
-markers = "extra == \"datadog\""
+groups = ["main", "dev"]
files = [
{file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"},
{file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"},
@@ -1679,10 +1724,9 @@ websockets = ["websocket-client (>=1.3.0)"]
name = "envier"
version = "0.6.1"
description = "Python application configuration via the environment"
-optional = true
+optional = false
python-versions = ">=3.7"
-groups = ["main"]
-markers = "extra == \"datadog\""
+groups = ["main", "dev"]
files = [
{file = "envier-0.6.1-py3-none-any.whl", hash = "sha256:73609040a76be48bbcb97074d9969666484aa0de706183a6e9ef773156a8a6a9"},
{file = "envier-0.6.1.tar.gz", hash = "sha256:3309a01bb3d8850c9e7a31a5166d5a836846db2faecb79b9cb32654dd50ca9f9"},
@@ -1756,14 +1800,14 @@ tomli = ">=2.0.1,<3"
[[package]]
name = "filelock"
-version = "3.17.0"
+version = "3.18.0"
description = "A platform independent file lock."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"},
- {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"},
+ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"},
+ {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"},
]
[package.extras]
@@ -1825,14 +1869,14 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.
[[package]]
name = "griffe"
-version = "1.5.6"
+version = "1.6.2"
description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "griffe-1.5.6-py3-none-any.whl", hash = "sha256:b2a3afe497c6c1f952e54a23095ecc09435016293e77af8478ed65df1022a394"},
- {file = "griffe-1.5.6.tar.gz", hash = "sha256:181f6666d5aceb6cd6e2da5a2b646cfb431e47a0da1fda283845734b67e10944"},
+ {file = "griffe-1.6.2-py3-none-any.whl", hash = "sha256:6399f7e663150e4278a312a8e8a14d2f3d7bd86e2ef2f8056a1058e38579c2ee"},
+ {file = "griffe-1.6.2.tar.gz", hash = "sha256:3a46fa7bd83280909b63c12b9a975732a927dd97809efe5b7972290b606c5d91"},
]
[package.dependencies]
@@ -2040,7 +2084,7 @@ version = "8.6.1"
description = "Read metadata from Python packages"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"},
{file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"},
@@ -2141,14 +2185,14 @@ files = [
[[package]]
name = "jsii"
-version = "1.108.0"
+version = "1.109.0"
description = "Python client for jsii runtime"
optional = false
-python-versions = "~=3.8"
+python-versions = "~=3.9"
groups = ["dev"]
files = [
- {file = "jsii-1.108.0-py3-none-any.whl", hash = "sha256:d6c99671ab44520069ad6198e3b07379ae9c075bcb53b8a16455c1beb10288ea"},
- {file = "jsii-1.108.0.tar.gz", hash = "sha256:f1053a414ac117c6ecae7208c5ca4cb6d10ca3420c69e30f8b9cca64cc37e61b"},
+ {file = "jsii-1.109.0-py3-none-any.whl", hash = "sha256:100bb48c7f74b8e22b3182c5466db1c32565ddb681ed5e2bf556076a734d3f07"},
+ {file = "jsii-1.109.0.tar.gz", hash = "sha256:85e0deca8089e2918776541e986d5abab90a66d4330eedfc14e8a060dd507bad"},
]
[package.dependencies]
@@ -2245,10 +2289,10 @@ referencing = ">=0.31.0"
name = "legacy-cgi"
version = "2.6.2"
description = "Fork of the standard library cgi and cgitb modules, being deprecated in PEP-594"
-optional = true
+optional = false
python-versions = ">=3.10"
-groups = ["main"]
-markers = "python_version >= \"3.13.0\" and extra == \"datadog\""
+groups = ["main", "dev"]
+markers = "python_version >= \"3.13.0\""
files = [
{file = "legacy_cgi-2.6.2-py3-none-any.whl", hash = "sha256:a7b83afb1baf6ebeb56522537c5943ef9813cf933f6715e88a803f7edbce0bff"},
{file = "legacy_cgi-2.6.2.tar.gz", hash = "sha256:9952471ceb304043b104c22d00b4f333cac27a6abe446d8a528fc437cf13c85f"},
@@ -2515,14 +2559,14 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4) ; platform
[[package]]
name = "mkdocs-autorefs"
-version = "1.3.0"
+version = "1.4.1"
description = "Automatically link across pages in MkDocs."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "mkdocs_autorefs-1.3.0-py3-none-any.whl", hash = "sha256:d180f9778a04e78b7134e31418f238bba56f56d6a8af97873946ff661befffb3"},
- {file = "mkdocs_autorefs-1.3.0.tar.gz", hash = "sha256:6867764c099ace9025d6ac24fd07b85a98335fbd30107ef01053697c8f46db61"},
+ {file = "mkdocs_autorefs-1.4.1-py3-none-any.whl", hash = "sha256:9793c5ac06a6ebbe52ec0f8439256e66187badf4b5334b5fde0b128ec134df4f"},
+ {file = "mkdocs_autorefs-1.4.1.tar.gz", hash = "sha256:4b5b6235a4becb2b10425c2fa191737e415b37aa3418919db33e5d774c9db079"},
]
[package.dependencies]
@@ -2566,14 +2610,14 @@ mkdocs = ">=0.17"
[[package]]
name = "mkdocs-material"
-version = "9.6.7"
+version = "9.6.9"
description = "Documentation that simply works"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "mkdocs_material-9.6.7-py3-none-any.whl", hash = "sha256:8a159e45e80fcaadd9fbeef62cbf928569b93df954d4dc5ba76d46820caf7b47"},
- {file = "mkdocs_material-9.6.7.tar.gz", hash = "sha256:3e2c1fceb9410056c2d91f334a00cdea3215c28750e00c691c1e46b2a33309b4"},
+ {file = "mkdocs_material-9.6.9-py3-none-any.whl", hash = "sha256:6e61b7fb623ce2aa4622056592b155a9eea56ff3487d0835075360be45a4c8d1"},
+ {file = "mkdocs_material-9.6.9.tar.gz", hash = "sha256:a4872139715a1f27b2aa3f3dc31a9794b7bbf36333c0ba4607cf04786c94f89c"},
]
[package.dependencies]
@@ -2608,14 +2652,14 @@ files = [
[[package]]
name = "mkdocstrings"
-version = "0.28.0"
+version = "0.29.0"
description = "Automatic documentation from sources, for MkDocs."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "mkdocstrings-0.28.0-py3-none-any.whl", hash = "sha256:84cf3dc910614781fe0fee46ce8006fde7df6cc7cca2e3f799895fb8a9170b39"},
- {file = "mkdocstrings-0.28.0.tar.gz", hash = "sha256:df20afef1eafe36ba466ae20732509ecb74237653a585f5061937e54b553b4e0"},
+ {file = "mkdocstrings-0.29.0-py3-none-any.whl", hash = "sha256:8ea98358d2006f60befa940fdebbbc88a26b37ecbcded10be726ba359284f73d"},
+ {file = "mkdocstrings-0.29.0.tar.gz", hash = "sha256:3657be1384543ce0ee82112c3e521bbf48e41303aa0c229b9ffcccba057d922e"},
]
[package.dependencies]
@@ -2623,33 +2667,32 @@ importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
Jinja2 = ">=2.11.1"
Markdown = ">=3.6"
MarkupSafe = ">=1.1"
-mkdocs = ">=1.4"
-mkdocs-autorefs = ">=1.3"
-mkdocs-get-deps = ">=0.2"
+mkdocs = ">=1.6"
+mkdocs-autorefs = ">=1.4"
pymdown-extensions = ">=6.3"
typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""}
[package.extras]
crystal = ["mkdocstrings-crystal (>=0.3.4)"]
-python = ["mkdocstrings-python (>=0.5.2)"]
+python = ["mkdocstrings-python (>=1.16.2)"]
python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"]
[[package]]
name = "mkdocstrings-python"
-version = "1.16.1"
+version = "1.16.8"
description = "A Python handler for mkdocstrings."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "mkdocstrings_python-1.16.1-py3-none-any.whl", hash = "sha256:b88ff6fc6a293cee9cb42313f1cba37a2c5cdf37bcc60b241ec7ab66b5d41b58"},
- {file = "mkdocstrings_python-1.16.1.tar.gz", hash = "sha256:d7152d17da74d3616a0f17df5d2da771ecf7340518c158650e5a64a0a95973f4"},
+ {file = "mkdocstrings_python-1.16.8-py3-none-any.whl", hash = "sha256:211b7aaf776cd45578ecb531e5ad0d3a35a8be9101a6bfa10de38a69af9d8fd8"},
+ {file = "mkdocstrings_python-1.16.8.tar.gz", hash = "sha256:9453ccae69be103810c1cf6435ce71c8f714ae37fef4d87d16aa92a7c800fe1d"},
]
[package.dependencies]
-griffe = ">=0.49"
-mkdocs-autorefs = ">=1.2"
-mkdocstrings = ">=0.28"
+griffe = ">=1.6.2"
+mkdocs-autorefs = ">=1.4"
+mkdocstrings = ">=0.28.3"
typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""}
[[package]]
@@ -2815,14 +2858,14 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""}
[[package]]
name = "mypy-boto3-dynamodb"
-version = "1.37.0"
-description = "Type annotations for boto3 DynamoDB 1.37.0 service generated with mypy-boto3-builder 8.9.2"
+version = "1.37.12"
+description = "Type annotations for boto3 DynamoDB 1.37.12 service generated with mypy-boto3-builder 8.10.0"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "mypy_boto3_dynamodb-1.37.0-py3-none-any.whl", hash = "sha256:3ab2c0b7eda0440804918c4f4765efcc296491be39a56ece67b6d5b72a39e8b2"},
- {file = "mypy_boto3_dynamodb-1.37.0.tar.gz", hash = "sha256:ba421689c3f00c6616ab05e0c2145fb8f97d014bba386caa89b1a4451a49d2b8"},
+ {file = "mypy_boto3_dynamodb-1.37.12-py3-none-any.whl", hash = "sha256:a4b2770ec1f8d6096b5e6d863800f3ff742c86a17dfa5e6b012ed7f7ccd28921"},
+ {file = "mypy_boto3_dynamodb-1.37.12.tar.gz", hash = "sha256:0e4d7a16fb9dba7aab7ac9ba8ff3721f9696a8484b1eed693b7949164b7805ba"},
]
[package.dependencies]
@@ -2845,14 +2888,14 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""}
[[package]]
name = "mypy-boto3-logs"
-version = "1.37.0"
-description = "Type annotations for boto3 CloudWatchLogs 1.37.0 service generated with mypy-boto3-builder 8.9.2"
+version = "1.37.12"
+description = "Type annotations for boto3 CloudWatchLogs 1.37.12 service generated with mypy-boto3-builder 8.10.0"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "mypy_boto3_logs-1.37.0-py3-none-any.whl", hash = "sha256:74c5a2a7f7c6faf49970cad94d93909a15935c206f2920c6a55de8721f1a9aa6"},
- {file = "mypy_boto3_logs-1.37.0.tar.gz", hash = "sha256:9e3785499d48ce73427f2f79d5b908273ea9960bde40b33284d4c95fb041c3a7"},
+ {file = "mypy_boto3_logs-1.37.12-py3-none-any.whl", hash = "sha256:7861bdde73fb41efa080deb66980727164d582293f49e2cfbc81da45710b459e"},
+ {file = "mypy_boto3_logs-1.37.12.tar.gz", hash = "sha256:184547a47deae4d06d3f36b93d18b9742d55bf09b66dc48ec4a9e70c79a9e2da"},
]
[package.dependencies]
@@ -2890,14 +2933,14 @@ typing-extensions = {version = "*", markers = "python_version < \"3.12\""}
[[package]]
name = "mypy-boto3-ssm"
-version = "1.37.0"
-description = "Type annotations for boto3 SSM 1.37.0 service generated with mypy-boto3-builder 8.9.2"
+version = "1.37.4"
+description = "Type annotations for boto3 SSM 1.37.4 service generated with mypy-boto3-builder 8.10.0"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "mypy_boto3_ssm-1.37.0-py3-none-any.whl", hash = "sha256:09229b321969c4eb5b7e587e4f8078780605aa9d86baa9cdec6b924ef2a42024"},
- {file = "mypy_boto3_ssm-1.37.0.tar.gz", hash = "sha256:d250c41e87f9983b885f0b105449a54b74de19764aefb16e6066c8e06c5b57ae"},
+ {file = "mypy_boto3_ssm-1.37.4-py3-none-any.whl", hash = "sha256:db8097b631ccba425a5bc65c189f2e2933ac908671e4d436195c75f22305cab6"},
+ {file = "mypy_boto3_ssm-1.37.4.tar.gz", hash = "sha256:7e7869788aa4db85171278990a115a76425b2de6db28074a1f166b946ecca522"},
]
[package.dependencies]
@@ -2937,6 +2980,7 @@ description = "Python package for creating and manipulating graphs and networks"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
+markers = "python_version < \"3.10\""
files = [
{file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"},
{file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"},
@@ -2949,6 +2993,27 @@ doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.
extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"]
test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
+[[package]]
+name = "networkx"
+version = "3.4.2"
+description = "Python package for creating and manipulating graphs and networks"
+optional = false
+python-versions = ">=3.10"
+groups = ["dev"]
+markers = "python_version >= \"3.10\""
+files = [
+ {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"},
+ {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"},
+]
+
+[package.extras]
+default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"]
+developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"]
+doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"]
+example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"]
+extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"]
+test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
+
[[package]]
name = "nox"
version = "2024.10.9"
@@ -2974,20 +3039,19 @@ uv = ["uv (>=0.1.6)"]
[[package]]
name = "opentelemetry-api"
-version = "1.16.0"
+version = "1.31.0"
description = "OpenTelemetry Python API"
-optional = true
-python-versions = ">=3.7"
-groups = ["main"]
-markers = "extra == \"datadog\""
+optional = false
+python-versions = ">=3.8"
+groups = ["main", "dev"]
files = [
- {file = "opentelemetry_api-1.16.0-py3-none-any.whl", hash = "sha256:79e8f0cf88dbdd36b6abf175d2092af1efcaa2e71552d0d2b3b181a9707bf4bc"},
- {file = "opentelemetry_api-1.16.0.tar.gz", hash = "sha256:4b0e895a3b1f5e1908043ebe492d33e33f9ccdbe6d02d3994c2f8721a63ddddb"},
+ {file = "opentelemetry_api-1.31.0-py3-none-any.whl", hash = "sha256:145b72c6c16977c005c568ec32f4946054ab793d8474a17fd884b0397582c5f2"},
+ {file = "opentelemetry_api-1.31.0.tar.gz", hash = "sha256:d8da59e83e8e3993b4726e4c1023cd46f57c4d5a73142e239247e7d814309de1"},
]
[package.dependencies]
deprecated = ">=1.2.6"
-setuptools = ">=16.0"
+importlib-metadata = ">=6.0,<8.7.0"
[[package]]
name = "packaging"
@@ -3031,16 +3095,19 @@ files = [
[[package]]
name = "pbr"
-version = "6.1.0"
+version = "6.1.1"
description = "Python Build Reasonableness"
optional = false
python-versions = ">=2.6"
groups = ["dev"]
files = [
- {file = "pbr-6.1.0-py2.py3-none-any.whl", hash = "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"},
- {file = "pbr-6.1.0.tar.gz", hash = "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24"},
+ {file = "pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76"},
+ {file = "pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b"},
]
+[package.dependencies]
+setuptools = "*"
+
[[package]]
name = "platformdirs"
version = "4.3.6"
@@ -3089,24 +3156,21 @@ files = [
[[package]]
name = "protobuf"
-version = "5.29.3"
+version = "6.30.1"
description = ""
-optional = true
-python-versions = ">=3.8"
-groups = ["main"]
-markers = "extra == \"datadog\""
+optional = false
+python-versions = ">=3.9"
+groups = ["main", "dev"]
files = [
- {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"},
- {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"},
- {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"},
- {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"},
- {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"},
- {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"},
- {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"},
- {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"},
- {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"},
- {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"},
- {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"},
+ {file = "protobuf-6.30.1-cp310-abi3-win32.whl", hash = "sha256:ba0706f948d0195f5cac504da156d88174e03218d9364ab40d903788c1903d7e"},
+ {file = "protobuf-6.30.1-cp310-abi3-win_amd64.whl", hash = "sha256:ed484f9ddd47f0f1bf0648806cccdb4fe2fb6b19820f9b79a5adf5dcfd1b8c5f"},
+ {file = "protobuf-6.30.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aa4f7dfaed0d840b03d08d14bfdb41348feaee06a828a8c455698234135b4075"},
+ {file = "protobuf-6.30.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:47cd320b7db63e8c9ac35f5596ea1c1e61491d8a8eb6d8b45edc44760b53a4f6"},
+ {file = "protobuf-6.30.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3083660225fa94748ac2e407f09a899e6a28bf9c0e70c75def8d15706bf85fc"},
+ {file = "protobuf-6.30.1-cp39-cp39-win32.whl", hash = "sha256:554d7e61cce2aa4c63ca27328f757a9f3867bce8ec213bf09096a8d16bcdcb6a"},
+ {file = "protobuf-6.30.1-cp39-cp39-win_amd64.whl", hash = "sha256:b510f55ce60f84dc7febc619b47215b900466e3555ab8cb1ba42deb4496d6cc0"},
+ {file = "protobuf-6.30.1-py3-none-any.whl", hash = "sha256:3c25e51e1359f1f5fa3b298faa6016e650d148f214db2e47671131b9063c53be"},
+ {file = "protobuf-6.30.1.tar.gz", hash = "sha256:535fb4e44d0236893d5cf1263a0f706f1160b689a7ab962e9da8a9ce4050b780"},
]
[[package]]
@@ -3321,14 +3385,14 @@ windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pymdown-extensions"
-version = "10.14.2"
+version = "10.14.3"
description = "Extension pack for Python Markdown."
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1"},
- {file = "pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253"},
+ {file = "pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9"},
+ {file = "pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b"},
]
[package.dependencies]
@@ -3522,31 +3586,29 @@ cli = ["click (>=5.0)"]
[[package]]
name = "pywin32"
-version = "308"
+version = "310"
description = "Python for Window Extensions"
optional = false
python-versions = "*"
groups = ["dev"]
markers = "sys_platform == \"win32\""
files = [
- {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"},
- {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"},
- {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"},
- {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"},
- {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"},
- {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"},
- {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"},
- {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"},
- {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"},
- {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"},
- {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"},
- {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"},
- {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"},
- {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"},
- {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"},
- {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"},
- {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"},
- {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"},
+ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"},
+ {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"},
+ {file = "pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213"},
+ {file = "pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd"},
+ {file = "pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c"},
+ {file = "pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582"},
+ {file = "pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d"},
+ {file = "pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060"},
+ {file = "pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966"},
+ {file = "pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab"},
+ {file = "pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e"},
+ {file = "pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33"},
+ {file = "pywin32-310-cp38-cp38-win32.whl", hash = "sha256:0867beb8addefa2e3979d4084352e4ac6e991ca45373390775f7084cc0209b9c"},
+ {file = "pywin32-310-cp38-cp38-win_amd64.whl", hash = "sha256:30f0a9b3138fb5e07eb4973b7077e1883f558e40c578c6925acc7a94c34eaa36"},
+ {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"},
+ {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"},
]
[[package]]
@@ -3892,162 +3954,162 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]]
name = "rpds-py"
-version = "0.22.3"
+version = "0.23.1"
description = "Python bindings to Rust's persistent data structures (rpds)"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"},
- {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"},
- {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"},
- {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"},
- {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"},
- {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"},
- {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"},
- {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"},
- {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"},
- {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"},
- {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"},
- {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"},
- {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"},
- {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"},
- {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"},
- {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"},
- {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"},
- {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"},
- {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"},
- {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"},
- {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"},
- {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"},
- {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"},
- {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"},
- {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"},
- {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"},
- {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"},
- {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"},
- {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"},
- {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"},
- {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"},
- {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"},
- {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"},
- {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"},
- {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"},
- {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"},
- {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"},
- {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"},
- {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"},
- {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"},
- {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"},
- {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"},
- {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"},
- {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"},
- {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"},
- {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"},
- {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"},
- {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"},
- {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"},
- {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"},
- {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"},
- {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"},
- {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"},
- {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"},
- {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"},
- {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"},
- {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"},
- {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"},
- {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"},
- {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"},
- {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"},
- {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"},
- {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"},
- {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"},
- {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"},
- {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"},
- {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"},
- {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"},
- {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"},
- {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"},
- {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"},
- {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"},
- {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"},
- {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"},
- {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"},
- {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"},
- {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"},
- {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"},
- {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"},
- {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"},
- {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"},
+ {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"},
+ {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"},
+ {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ee9d6f0b38efb22ad94c3b68ffebe4c47865cdf4b17f6806d6c674e1feb4246"},
+ {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7356a6da0562190558c4fcc14f0281db191cdf4cb96e7604c06acfcee96df15"},
+ {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9441af1d25aed96901f97ad83d5c3e35e6cd21a25ca5e4916c82d7dd0490a4fa"},
+ {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d8abf7896a91fb97e7977d1aadfcc2c80415d6dc2f1d0fca5b8d0df247248f3"},
+ {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b08027489ba8fedde72ddd233a5ea411b85a6ed78175f40285bd401bde7466d"},
+ {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fee513135b5a58f3bb6d89e48326cd5aa308e4bcdf2f7d59f67c861ada482bf8"},
+ {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:35d5631ce0af26318dba0ae0ac941c534453e42f569011585cb323b7774502a5"},
+ {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a20cb698c4a59c534c6701b1c24a968ff2768b18ea2991f886bd8985ce17a89f"},
+ {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e9c206a1abc27e0588cf8b7c8246e51f1a16a103734f7750830a1ccb63f557a"},
+ {file = "rpds_py-0.23.1-cp310-cp310-win32.whl", hash = "sha256:d9f75a06ecc68f159d5d7603b734e1ff6daa9497a929150f794013aa9f6e3f12"},
+ {file = "rpds_py-0.23.1-cp310-cp310-win_amd64.whl", hash = "sha256:f35eff113ad430b5272bbfc18ba111c66ff525828f24898b4e146eb479a2cdda"},
+ {file = "rpds_py-0.23.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b79f5ced71efd70414a9a80bbbfaa7160da307723166f09b69773153bf17c590"},
+ {file = "rpds_py-0.23.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c9e799dac1ffbe7b10c1fd42fe4cd51371a549c6e108249bde9cd1200e8f59b4"},
+ {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721f9c4011b443b6e84505fc00cc7aadc9d1743f1c988e4c89353e19c4a968ee"},
+ {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f88626e3f5e57432e6191cd0c5d6d6b319b635e70b40be2ffba713053e5147dd"},
+ {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:285019078537949cecd0190f3690a0b0125ff743d6a53dfeb7a4e6787af154f5"},
+ {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92f5654157de1379c509b15acec9d12ecf6e3bc1996571b6cb82a4302060447"},
+ {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e768267cbe051dd8d1c5305ba690bb153204a09bf2e3de3ae530de955f5b5580"},
+ {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5334a71f7dc1160382d45997e29f2637c02f8a26af41073189d79b95d3321f1"},
+ {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6adb81564af0cd428910f83fa7da46ce9ad47c56c0b22b50872bc4515d91966"},
+ {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cafa48f2133d4daa028473ede7d81cd1b9f9e6925e9e4003ebdf77010ee02f35"},
+ {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fced9fd4a07a1ded1bac7e961ddd9753dd5d8b755ba8e05acba54a21f5f1522"},
+ {file = "rpds_py-0.23.1-cp311-cp311-win32.whl", hash = "sha256:243241c95174b5fb7204c04595852fe3943cc41f47aa14c3828bc18cd9d3b2d6"},
+ {file = "rpds_py-0.23.1-cp311-cp311-win_amd64.whl", hash = "sha256:11dd60b2ffddba85715d8a66bb39b95ddbe389ad2cfcf42c833f1bcde0878eaf"},
+ {file = "rpds_py-0.23.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3902df19540e9af4cc0c3ae75974c65d2c156b9257e91f5101a51f99136d834c"},
+ {file = "rpds_py-0.23.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66f8d2a17e5838dd6fb9be6baaba8e75ae2f5fa6b6b755d597184bfcd3cb0eba"},
+ {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:112b8774b0b4ee22368fec42749b94366bd9b536f8f74c3d4175d4395f5cbd31"},
+ {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0df046f2266e8586cf09d00588302a32923eb6386ced0ca5c9deade6af9a149"},
+ {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3288930b947cbebe767f84cf618d2cbe0b13be476e749da0e6a009f986248c"},
+ {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce473a2351c018b06dd8d30d5da8ab5a0831056cc53b2006e2a8028172c37ce5"},
+ {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d550d7e9e7d8676b183b37d65b5cd8de13676a738973d330b59dc8312df9c5dc"},
+ {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e14f86b871ea74c3fddc9a40e947d6a5d09def5adc2076ee61fb910a9014fb35"},
+ {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf5be5ba34e19be579ae873da515a2836a2166d8d7ee43be6ff909eda42b72b"},
+ {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7031d493c4465dbc8d40bd6cafefef4bd472b17db0ab94c53e7909ee781b9ef"},
+ {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55ff4151cfd4bc635e51cfb1c59ac9f7196b256b12e3a57deb9e5742e65941ad"},
+ {file = "rpds_py-0.23.1-cp312-cp312-win32.whl", hash = "sha256:a9d3b728f5a5873d84cba997b9d617c6090ca5721caaa691f3b1a78c60adc057"},
+ {file = "rpds_py-0.23.1-cp312-cp312-win_amd64.whl", hash = "sha256:b03a8d50b137ee758e4c73638b10747b7c39988eb8e6cd11abb7084266455165"},
+ {file = "rpds_py-0.23.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4caafd1a22e5eaa3732acb7672a497123354bef79a9d7ceed43387d25025e935"},
+ {file = "rpds_py-0.23.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:178f8a60fc24511c0eb756af741c476b87b610dba83270fce1e5a430204566a4"},
+ {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c632419c3870507ca20a37c8f8f5352317aca097639e524ad129f58c125c61c6"},
+ {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:698a79d295626ee292d1730bc2ef6e70a3ab135b1d79ada8fde3ed0047b65a10"},
+ {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271fa2184cf28bdded86bb6217c8e08d3a169fe0bbe9be5e8d96e8476b707122"},
+ {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b91cceb5add79ee563bd1f70b30896bd63bc5f78a11c1f00a1e931729ca4f1f4"},
+ {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a6cb95074777f1ecda2ca4fa7717caa9ee6e534f42b7575a8f0d4cb0c24013"},
+ {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50fb62f8d8364978478b12d5f03bf028c6bc2af04082479299139dc26edf4c64"},
+ {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8f7e90b948dc9dcfff8003f1ea3af08b29c062f681c05fd798e36daa3f7e3e8"},
+ {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5b98b6c953e5c2bda51ab4d5b4f172617d462eebc7f4bfdc7c7e6b423f6da957"},
+ {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2893d778d4671ee627bac4037a075168b2673c57186fb1a57e993465dbd79a93"},
+ {file = "rpds_py-0.23.1-cp313-cp313-win32.whl", hash = "sha256:2cfa07c346a7ad07019c33fb9a63cf3acb1f5363c33bc73014e20d9fe8b01cdd"},
+ {file = "rpds_py-0.23.1-cp313-cp313-win_amd64.whl", hash = "sha256:3aaf141d39f45322e44fc2c742e4b8b4098ead5317e5f884770c8df0c332da70"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:759462b2d0aa5a04be5b3e37fb8183615f47014ae6b116e17036b131985cb731"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3e9212f52074fc9d72cf242a84063787ab8e21e0950d4d6709886fb62bcb91d5"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e9f3a3ac919406bc0414bbbd76c6af99253c507150191ea79fab42fdb35982a"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c04ca91dda8a61584165825907f5c967ca09e9c65fe8966ee753a3f2b019fe1e"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab923167cfd945abb9b51a407407cf19f5bee35001221f2911dc85ffd35ff4f"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed6f011bedca8585787e5082cce081bac3d30f54520097b2411351b3574e1219"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959bb9928c5c999aba4a3f5a6799d571ddc2c59ff49917ecf55be2bbb4e3722"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ed7de3c86721b4e83ac440751329ec6a1102229aa18163f84c75b06b525ad7e"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb89edee2fa237584e532fbf78f0ddd1e49a47c7c8cfa153ab4849dc72a35e6"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7e5413d2e2d86025e73f05510ad23dad5950ab8417b7fc6beaad99be8077138b"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d31ed4987d72aabdf521eddfb6a72988703c091cfc0064330b9e5f8d6a042ff5"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-win32.whl", hash = "sha256:f3429fb8e15b20961efca8c8b21432623d85db2228cc73fe22756c6637aa39e7"},
+ {file = "rpds_py-0.23.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d"},
+ {file = "rpds_py-0.23.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:09cd7dbcb673eb60518231e02874df66ec1296c01a4fcd733875755c02014b19"},
+ {file = "rpds_py-0.23.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6760211eee3a76316cf328f5a8bd695b47b1626d21c8a27fb3b2473a884d597"},
+ {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e680c1518733b73c994361e4b06441b92e973ef7d9449feec72e8ee4f713da"},
+ {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae28144c1daa61366205d32abd8c90372790ff79fc60c1a8ad7fd3c8553a600e"},
+ {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c698d123ce5d8f2d0cd17f73336615f6a2e3bdcedac07a1291bb4d8e7d82a05a"},
+ {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98b257ae1e83f81fb947a363a274c4eb66640212516becaff7bef09a5dceacaa"},
+ {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c9ff044eb07c8468594d12602291c635da292308c8c619244e30698e7fc455a"},
+ {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7938c7b0599a05246d704b3f5e01be91a93b411d0d6cc62275f025293b8a11ce"},
+ {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e9cb79ecedfc156c0692257ac7ed415243b6c35dd969baa461a6888fc79f2f07"},
+ {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7b77e07233925bd33fc0022b8537774423e4c6680b6436316c5075e79b6384f4"},
+ {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a970bfaf130c29a679b1d0a6e0f867483cea455ab1535fb427566a475078f27f"},
+ {file = "rpds_py-0.23.1-cp39-cp39-win32.whl", hash = "sha256:4233df01a250b3984465faed12ad472f035b7cd5240ea3f7c76b7a7016084495"},
+ {file = "rpds_py-0.23.1-cp39-cp39-win_amd64.whl", hash = "sha256:c617d7453a80e29d9973b926983b1e700a9377dbe021faa36041c78537d7b08c"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c1f8afa346ccd59e4e5630d5abb67aba6a9812fddf764fd7eb11f382a345f8cc"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fad784a31869747df4ac968a351e070c06ca377549e4ace94775aaa3ab33ee06"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a96fcac2f18e5a0a23a75cd27ce2656c66c11c127b0318e508aab436b77428"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e77febf227a1dc3220159355dba68faa13f8dca9335d97504abf428469fb18b"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26bb3e8de93443d55e2e748e9fd87deb5f8075ca7bc0502cfc8be8687d69a2ec"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db7707dde9143a67b8812c7e66aeb2d843fe33cc8e374170f4d2c50bd8f2472d"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eedaaccc9bb66581d4ae7c50e15856e335e57ef2734dbc5fd8ba3e2a4ab3cb6"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28358c54fffadf0ae893f6c1050e8f8853e45df22483b7fff2f6ab6152f5d8bf"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:633462ef7e61d839171bf206551d5ab42b30b71cac8f10a64a662536e057fdef"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a98f510d86f689fcb486dc59e6e363af04151e5260ad1bdddb5625c10f1e95f8"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e0397dd0b3955c61ef9b22838144aa4bef6f0796ba5cc8edfc64d468b93798b4"},
+ {file = "rpds_py-0.23.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:75307599f0d25bf6937248e5ac4e3bde5ea72ae6618623b86146ccc7845ed00b"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3614d280bf7aab0d3721b5ce0e73434acb90a2c993121b6e81a1c15c665298ac"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e5963ea87f88bddf7edd59644a35a0feecf75f8985430124c253612d4f7d27ae"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76f44f70aac3a54ceb1813ca630c53415da3a24fd93c570b2dfb4856591017"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c6ae11e6e93728d86aafc51ced98b1658a0080a7dd9417d24bfb955bb09c3c2"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc869af5cba24d45fb0399b0cfdbcefcf6910bf4dee5d74036a57cf5264b3ff4"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76b32eb2ab650a29e423525e84eb197c45504b1c1e6e17b6cc91fcfeb1a4b1d"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4263320ed887ed843f85beba67f8b2d1483b5947f2dc73a8b068924558bfeace"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f9682a8f71acdf59fd554b82b1c12f517118ee72c0f3944eda461606dfe7eb9"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:754fba3084b70162a6b91efceee8a3f06b19e43dac3f71841662053c0584209a"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:a1c66e71ecfd2a4acf0e4bd75e7a3605afa8f9b28a3b497e4ba962719df2be57"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8d67beb6002441faef8251c45e24994de32c4c8686f7356a1f601ad7c466f7c3"},
+ {file = "rpds_py-0.23.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a1e17d8dc8e57d8e0fd21f8f0f0a5211b3fa258b2e444c2053471ef93fe25a00"},
+ {file = "rpds_py-0.23.1.tar.gz", hash = "sha256:7f3240dcfa14d198dba24b8b9cb3b108c06b68d45b7babd9eefc1038fdf7e707"},
]
[[package]]
name = "ruff"
-version = "0.9.9"
+version = "0.11.2"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
groups = ["dev"]
files = [
- {file = "ruff-0.9.9-py3-none-linux_armv6l.whl", hash = "sha256:628abb5ea10345e53dff55b167595a159d3e174d6720bf19761f5e467e68d367"},
- {file = "ruff-0.9.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b6cd1428e834b35d7493354723543b28cc11dc14d1ce19b685f6e68e07c05ec7"},
- {file = "ruff-0.9.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ee162652869120ad260670706f3cd36cd3f32b0c651f02b6da142652c54941d"},
- {file = "ruff-0.9.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3aa0f6b75082c9be1ec5a1db78c6d4b02e2375c3068438241dc19c7c306cc61a"},
- {file = "ruff-0.9.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:584cc66e89fb5f80f84b05133dd677a17cdd86901d6479712c96597a3f28e7fe"},
- {file = "ruff-0.9.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf3369325761a35aba75cd5c55ba1b5eb17d772f12ab168fbfac54be85cf18c"},
- {file = "ruff-0.9.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:3403a53a32a90ce929aa2f758542aca9234befa133e29f4933dcef28a24317be"},
- {file = "ruff-0.9.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18454e7fa4e4d72cffe28a37cf6a73cb2594f81ec9f4eca31a0aaa9ccdfb1590"},
- {file = "ruff-0.9.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fadfe2c88724c9617339f62319ed40dcdadadf2888d5afb88bf3adee7b35bfb"},
- {file = "ruff-0.9.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6df104d08c442a1aabcfd254279b8cc1e2cbf41a605aa3e26610ba1ec4acf0b0"},
- {file = "ruff-0.9.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d7c62939daf5b2a15af48abbd23bea1efdd38c312d6e7c4cedf5a24e03207e17"},
- {file = "ruff-0.9.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9494ba82a37a4b81b6a798076e4a3251c13243fc37967e998efe4cce58c8a8d1"},
- {file = "ruff-0.9.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4efd7a96ed6d36ef011ae798bf794c5501a514be369296c672dab7921087fa57"},
- {file = "ruff-0.9.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ab90a7944c5a1296f3ecb08d1cbf8c2da34c7e68114b1271a431a3ad30cb660e"},
- {file = "ruff-0.9.9-py3-none-win32.whl", hash = "sha256:6b4c376d929c25ecd6d87e182a230fa4377b8e5125a4ff52d506ee8c087153c1"},
- {file = "ruff-0.9.9-py3-none-win_amd64.whl", hash = "sha256:837982ea24091d4c1700ddb2f63b7070e5baec508e43b01de013dc7eff974ff1"},
- {file = "ruff-0.9.9-py3-none-win_arm64.whl", hash = "sha256:3ac78f127517209fe6d96ab00f3ba97cafe38718b23b1db3e96d8b2d39e37ddf"},
- {file = "ruff-0.9.9.tar.gz", hash = "sha256:0062ed13f22173e85f8f7056f9a24016e692efeea8704d1a5e8011b8aa850933"},
+ {file = "ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477"},
+ {file = "ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272"},
+ {file = "ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9"},
+ {file = "ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb"},
+ {file = "ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3"},
+ {file = "ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74"},
+ {file = "ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608"},
+ {file = "ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f"},
+ {file = "ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147"},
+ {file = "ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b"},
+ {file = "ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9"},
+ {file = "ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab"},
+ {file = "ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630"},
+ {file = "ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f"},
+ {file = "ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc"},
+ {file = "ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080"},
+ {file = "ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4"},
+ {file = "ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94"},
]
[[package]]
name = "s3transfer"
-version = "0.11.2"
+version = "0.11.4"
description = "An Amazon S3 Transfer Manager"
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
- {file = "s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc"},
- {file = "s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f"},
+ {file = "s3transfer-0.11.4-py3-none-any.whl", hash = "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d"},
+ {file = "s3transfer-0.11.4.tar.gz", hash = "sha256:559f161658e1cf0a911f45940552c696735f5c74e64362e515f333ebed87d679"},
]
[package.dependencies]
-botocore = ">=1.36.0,<2.0a.0"
+botocore = ">=1.37.4,<2.0a.0"
[package.extras]
-crt = ["botocore[crt] (>=1.36.0,<2.0a.0)"]
+crt = ["botocore[crt] (>=1.37.4,<2.0a.0)"]
[[package]]
name = "scantree"
@@ -4067,14 +4129,14 @@ pathspec = ">=0.10.1"
[[package]]
name = "sentry-sdk"
-version = "2.22.0"
+version = "2.24.1"
description = "Python client for Sentry (https://sentry.io)"
optional = false
python-versions = ">=3.6"
groups = ["dev"]
files = [
- {file = "sentry_sdk-2.22.0-py2.py3-none-any.whl", hash = "sha256:3d791d631a6c97aad4da7074081a57073126c69487560c6f8bffcf586461de66"},
- {file = "sentry_sdk-2.22.0.tar.gz", hash = "sha256:b4bf43bb38f547c84b2eadcefbe389b36ef75f3f38253d7a74d6b928c07ae944"},
+ {file = "sentry_sdk-2.24.1-py2.py3-none-any.whl", hash = "sha256:36baa6a1128b9d98d2adc5e9b2f887eff0a6af558fc2b96ed51919042413556d"},
+ {file = "sentry_sdk-2.24.1.tar.gz", hash = "sha256:8ba3c29990fa48865b908b3b9dc5ae7fa7e72407c7c9e91303e5206b32d7b8b1"},
]
[package.dependencies]
@@ -4124,15 +4186,14 @@ unleash = ["UnleashClient (>=6.0.1)"]
[[package]]
name = "setuptools"
-version = "75.8.0"
+version = "76.1.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
-optional = true
+optional = false
python-versions = ">=3.9"
-groups = ["main"]
-markers = "extra == \"datadog\""
+groups = ["dev"]
files = [
- {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"},
- {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"},
+ {file = "setuptools-76.1.0-py3-none-any.whl", hash = "sha256:34750dcb17d046929f545dec9b8349fe42bf4ba13ddffee78428aec422dbfb73"},
+ {file = "setuptools-76.1.0.tar.gz", hash = "sha256:4959b9ad482ada2ba2320c8f1a8d8481d4d8d668908a7a1b84d987375cd7f5bd"},
]
[package.extras]
@@ -4182,14 +4243,14 @@ files = [
[[package]]
name = "stevedore"
-version = "5.4.0"
+version = "5.4.1"
description = "Manage dynamic plugins for Python applications"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "stevedore-5.4.0-py3-none-any.whl", hash = "sha256:b0be3c4748b3ea7b854b265dcb4caa891015e442416422be16f8b31756107857"},
- {file = "stevedore-5.4.0.tar.gz", hash = "sha256:79e92235ecb828fe952b6b8b0c6c87863248631922c8e8e0fa5b17b232c4514d"},
+ {file = "stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe"},
+ {file = "stevedore-5.4.1.tar.gz", hash = "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b"},
]
[package.dependencies]
@@ -4328,26 +4389,26 @@ test = ["mypy ; platform_python_implementation != \"PyPy\"", "pytest", "typing-e
[[package]]
name = "types-awscrt"
-version = "0.23.8"
+version = "0.24.2"
description = "Type annotations and code completion for awscrt"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "types_awscrt-0.23.8-py3-none-any.whl", hash = "sha256:d66b3817565769f5311b7e171a3c48d3dbf8a8f9c22f02686c2f003b6559a2a5"},
- {file = "types_awscrt-0.23.8.tar.gz", hash = "sha256:2141391a8f4d36cf098406c19d9060b34f13a558c22d4aadac250a0c57d12710"},
+ {file = "types_awscrt-0.24.2-py3-none-any.whl", hash = "sha256:345ab84a4f75b26bfb816b249657855824a4f2d1ce5b58268c549f81fce6eccc"},
+ {file = "types_awscrt-0.24.2.tar.gz", hash = "sha256:5826baf69ad5d29c76be49fc7df00222281fa31b14f99e9fb4492d71ec98fea5"},
]
[[package]]
name = "types-cffi"
-version = "1.16.0.20241221"
+version = "1.16.0.20250318"
description = "Typing stubs for cffi"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "types_cffi-1.16.0.20241221-py3-none-any.whl", hash = "sha256:e5b76b4211d7a9185f6ab8d06a106d56c7eb80af7cdb8bfcb4186ade10fb112f"},
- {file = "types_cffi-1.16.0.20241221.tar.gz", hash = "sha256:1c96649618f4b6145f58231acb976e0b448be6b847f7ab733dabe62dfbff6591"},
+ {file = "types_cffi-1.16.0.20250318-py3-none-any.whl", hash = "sha256:1be00aa4274c8d5595ed96648db8fa4de06a1fa8e53c408b94b90b7215fe03ff"},
+ {file = "types_cffi-1.16.0.20250318.tar.gz", hash = "sha256:ccaed0d3c4110ee232b301bc550b7cfac51520dd1c6b0a48fe06307ba4cc0e4e"},
]
[package.dependencies]
@@ -4414,28 +4475,31 @@ types-urllib3 = "*"
[[package]]
name = "types-s3transfer"
-version = "0.11.2"
+version = "0.11.4"
description = "Type annotations and code completion for s3transfer"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "types_s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:09c31cff8c79a433fcf703b840b66d1f694a6c70c410ef52015dd4fe07ee0ae2"},
- {file = "types_s3transfer-0.11.2.tar.gz", hash = "sha256:3ccb8b90b14434af2fb0d6c08500596d93f3a83fb804a2bb843d9bf4f7c2ca60"},
+ {file = "types_s3transfer-0.11.4-py3-none-any.whl", hash = "sha256:2a76d92c07d4a3cb469e5343b2e7560e0b8078b2e03696a65407b8c44c861b61"},
+ {file = "types_s3transfer-0.11.4.tar.gz", hash = "sha256:05fde593c84270f19fd053f0b1e08f5a057d7c5f036b9884e68fb8cd3041ac30"},
]
[[package]]
name = "types-setuptools"
-version = "75.8.0.20250110"
+version = "76.0.0.20250313"
description = "Typing stubs for setuptools"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "types_setuptools-75.8.0.20250110-py3-none-any.whl", hash = "sha256:a9f12980bbf9bcdc23ecd80755789085bad6bfce4060c2275bc2b4ca9f2bc480"},
- {file = "types_setuptools-75.8.0.20250110.tar.gz", hash = "sha256:96f7ec8bbd6e0a54ea180d66ad68ad7a1d7954e7281a710ea2de75e355545271"},
+ {file = "types_setuptools-76.0.0.20250313-py3-none-any.whl", hash = "sha256:bf454b2a49b8cfd7ebcf5844d4dd5fe4c8666782df1e3663c5866fd51a47460e"},
+ {file = "types_setuptools-76.0.0.20250313.tar.gz", hash = "sha256:b2be66f550f95f3cad2a7d46177b273c7e9c80df7d257fa57addbbcfc8126a9e"},
]
+[package.dependencies]
+setuptools = "*"
+
[[package]]
name = "types-urllib3"
version = "1.26.25.14"
@@ -4464,10 +4528,9 @@ files = [
name = "ujson"
version = "5.10.0"
description = "Ultra fast JSON encoder and decoder for Python"
-optional = true
+optional = false
python-versions = ">=3.8"
-groups = ["main"]
-markers = "extra == \"datadog\""
+groups = ["main", "dev"]
files = [
{file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"},
{file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"},
@@ -4583,30 +4646,30 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
name = "uv"
-version = "0.5.27"
+version = "0.6.7"
description = "An extremely fast Python package and project manager, written in Rust."
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "uv-0.5.27-py3-none-linux_armv6l.whl", hash = "sha256:57ba7b4e9f5cc25c0a003f18b9a37a881a60e161cd081cfe3f540dd4c4dfa270"},
- {file = "uv-0.5.27-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5f6042fb5d29b09408a0f17016cce1b9ddc6298fbf712b15b01862078e1a4fc5"},
- {file = "uv-0.5.27-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5e8ce099c129e48c88c1bfa92f3b439c0dbd314e6ea29609ebe9f281c051e8ac"},
- {file = "uv-0.5.27-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:5ca212d3c8141e3f25b1aaed124f34c782af93d94ca03638f295fde6bb15f8a6"},
- {file = "uv-0.5.27-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bd021410bcaf64c197916c33d2bbca08b8ff3ced7e17936fa037dc96146dcca"},
- {file = "uv-0.5.27-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fef326056b5551f0ef9d2c0ddacfe69940bdc01b30d39a78fac13fe24c23bfe9"},
- {file = "uv-0.5.27-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:dc40d3912edde1a504dba31f034e88bc178c5ba8771c13aab8ca7781711be6bf"},
- {file = "uv-0.5.27-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ebfa9bbcf82db56cd65aca91b08839c247806a7c2cb6c7ddf8c762ece083e7bd"},
- {file = "uv-0.5.27-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:751e64d543a965a44a02aa1de9d83c861a2721cc57ee7f6aa7f1c6c6018b3511"},
- {file = "uv-0.5.27-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f78e0753dd24b0f1adb5cc99a733848ef59d070a3e2dba88810e7bf78512971b"},
- {file = "uv-0.5.27-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:e7eab779aa2cbdfb768c420d51f4275d60f9d68d54ee41e2db34966a16d1318b"},
- {file = "uv-0.5.27-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:4d9159eb1c1b4f762cba924ea879470752f17de48dc07516d22dea9887db6fd7"},
- {file = "uv-0.5.27-py3-none-musllinux_1_1_i686.whl", hash = "sha256:c31e440fc479da7385158393ab5f25a00dbb8c993f83deaaf3d4d3db3a706694"},
- {file = "uv-0.5.27-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:fb9e7f9ab760aa21dfaac5ff876f43683a7eab1619c8fe063438abf4dd3bddef"},
- {file = "uv-0.5.27-py3-none-win32.whl", hash = "sha256:9dfb3adaee9bd9574c7743ff9a3a108cb8f95ffef4fe85f177e435a996aa6428"},
- {file = "uv-0.5.27-py3-none-win_amd64.whl", hash = "sha256:3046562b314513c69f93f33f5d933d470413355257a5c67c8ea34022fa53fd3b"},
- {file = "uv-0.5.27-py3-none-win_arm64.whl", hash = "sha256:e0d265294b565f7b136d4dc65a7cb90aa98e0a9ff824edf33644537a231a45ab"},
- {file = "uv-0.5.27.tar.gz", hash = "sha256:5d8174d71c2d884181a79c96b35a0ef1e4b4a57356c53d781399da015f393b24"},
+ {file = "uv-0.6.7-py3-none-linux_armv6l.whl", hash = "sha256:d069bf5f02a5ccc7bff5f4a047e9b11569cb8c1f26db5ec3ee78e30b36ade0a6"},
+ {file = "uv-0.6.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b4beed4004f3cc9b2691d21c40a9a2ff3ddb0e2bb42cacc9545b58bec19c9df7"},
+ {file = "uv-0.6.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:33707fba877cf58cc47406d5910cbfd22cdb2e19451e8b79857d4699650ed37c"},
+ {file = "uv-0.6.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:04125921e6c670480254f8e63b863b1040bc84d6286f7a8c0b5a4d29f0aa55e9"},
+ {file = "uv-0.6.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f09db1158bcc3edad033ee0b5b6a4848af8291e3b271cd76ace3524825d84ea"},
+ {file = "uv-0.6.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ba45607c9140e8d391a5fd22d5d0b22fc7e0ce76988a39c6aeeb0065bc348a"},
+ {file = "uv-0.6.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:02bcb6e57aaa147b89bdcd55f5ef6c23b18883c8ce0859dafb2f1cf32ae010e3"},
+ {file = "uv-0.6.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04832e48d87328f75d7b59a2d00ee3ed3060eaca4777924dba1515f0c00ff5ac"},
+ {file = "uv-0.6.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8efd1da986f1380d4b225e1a2e39d5870697487775a3db5a24358b09946a431d"},
+ {file = "uv-0.6.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:840aa6212289f27d56b2c0cbeb4e95cb5726da8674663ab27d4ec80e3be2a081"},
+ {file = "uv-0.6.7-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:97e57773e6107ee578d2483e2cb1342dc2b9379d20f9e559668f053599347caf"},
+ {file = "uv-0.6.7-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:2cfc48a4b0cd10df5950d41503798f1b785f33eb0ab1cadf9ceb4a03839e5a48"},
+ {file = "uv-0.6.7-py3-none-musllinux_1_1_i686.whl", hash = "sha256:a572ce4c1286092414ada69ed05de4b2aca3666f30aa5b119191ccb30c7d96d6"},
+ {file = "uv-0.6.7-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:57be4e71104bf0244c9b19940bc877d1a7966c0ef43851950f56d2b8d18a8a5b"},
+ {file = "uv-0.6.7-py3-none-win32.whl", hash = "sha256:10465c6ec8a02b75deeef45f7b97fe74ae1ee9148b8f6fdd4c84fc4876de5745"},
+ {file = "uv-0.6.7-py3-none-win_amd64.whl", hash = "sha256:9bccdef3983f0d31830f3cbe6d00384a1d2d5a7175023ba6c5a8acea2804106a"},
+ {file = "uv-0.6.7-py3-none-win_arm64.whl", hash = "sha256:8c968ecabb39f3a6909435afc1ed84dc58cae05c99398f1975a0c5e22e4e8b1e"},
+ {file = "uv-0.6.7.tar.gz", hash = "sha256:aa558764265fb69c89c6b5dc7124265d74fb8265d81a91079912df376ff4a3b2"},
]
[[package]]
@@ -4626,14 +4689,14 @@ test = ["coverage", "flake8 (>=3.7)", "mypy", "pretend", "pytest"]
[[package]]
name = "virtualenv"
-version = "20.29.1"
+version = "20.29.3"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "virtualenv-20.29.1-py3-none-any.whl", hash = "sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779"},
- {file = "virtualenv-20.29.1.tar.gz", hash = "sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35"},
+ {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"},
+ {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"},
]
[package.dependencies]
@@ -4792,7 +4855,6 @@ files = [
{file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"},
{file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"},
]
-markers = {main = "extra == \"all\" or extra == \"datamasking\" or extra == \"tracer\" or extra == \"datadog\""}
[[package]]
name = "xenon"
@@ -4815,10 +4877,9 @@ requests = ">=2.0,<3.0"
name = "xmltodict"
version = "0.14.2"
description = "Makes working with XML feel like you are working with JSON"
-optional = true
+optional = false
python-versions = ">=3.6"
-groups = ["main"]
-markers = "extra == \"datadog\""
+groups = ["main", "dev"]
files = [
{file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"},
{file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"},
@@ -4830,7 +4891,7 @@ version = "3.21.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"},
{file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"},
@@ -4857,4 +4918,4 @@ validation = ["fastjsonschema"]
[metadata]
lock-version = "2.1"
python-versions = ">=3.9,<4.0.0"
-content-hash = "0334d01b743f26f4797b12836dc718313419a7587185352715f62dfb8983020d"
+content-hash = "1a853fc471bbd9b8bffcbeeb1e2e5beac44c77be4fc5dc75ed91764dbcb952b7"
diff --git a/provenance/3.8.1a0/multiple.intoto.jsonl b/provenance/3.8.1a0/multiple.intoto.jsonl
new file mode 100644
index 00000000000..f53ec4c286e
--- /dev/null
+++ b/provenance/3.8.1a0/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZTCCBuygAwIBAgIUOQIwuLSnz7mBG/aCRSeHLSgMF5owCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzEwMDgwNzQzWhcNMjUwMzEwMDgxNzQzWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdjRrDvQhQXD4jBC+alw6vB6nx3KopZDXn+rmMxmfowVogo1WADLdFbRkLex4GtmOUM8E5976zAezKy9GkRwhBKOCBgswggYHMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUNN24EkVOiE3nlGFppulPVIrcRe8wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCgwNjg5MzQ1YmZlM2E0ZTcxYjQ0ODVjYTMwZGI2YTMwODE0ZWFhNTIxMBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDCgwNjg5MzQ1YmZlM2E0ZTcxYjQ0ODVjYTMwZGI2YTMwODE0ZWFhNTIxMCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoMDY4OTM0NWJmZTNhNGU3MWI0NDg1Y2EzMGRiNmEzMDgxNGVhYTUyMTAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM3NTk2Mjg0NTgvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlX8YcuUAAAQDAEcwRQIhANX480bwGAPWDwnppHd9yOoUB8r26QI/mAIB/H18jAAEAiAG+et+GFlWAZ5qyKEDeURF/yR/nWjxC0tGOZk5ufNypjAKBggqhkjOPQQDAwNnADBkAjBPKxGoZ1fN9bQkduQSe2xP7RyBnyeilWRcdg5l7M7vze6CWmYY4c4o54mPO1EaxmUCMD7itlHtCWpZJ/Pk60Cqj955HCloANA3lF5NQdMm4/yjNdbeJqrk8H5ndcG+LMFEgQ=="}, "tlogEntries":[{"logIndex":"179604253", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1741594063", "inclusionPromise":{"signedEntryTimestamp":"MEQCIBB1ED7bkBCW4m8gggt0tiLlKYK1Hg3ZuvF0+d9kriySAiBD+l/YY5lay8OGMhiRAWiwxmTVoof3EXLDTOjnzNyufQ=="}, "inclusionProof":{"logIndex":"57699991", "rootHash":"iiG/VXe8ooszx44pun2CVoicJ+ebtd2c9QWcIaXumek=", "treeSize":"57699998", "hashes":["pIfzisNnqIiqOxWcsu8ses4cBOMPZ612W0ekKO/EJHU=", "KPa35PGnRnivV6GMHUCPAn4q+P+uQZK/9zbaMGkXGLQ=", "Dm5Hao1jGEdV/ToBKHLz3BcOmpLjadcZlW7700Ct9MA=", "pB3VgyFW9WRXPT6brAtqt67HP0G1Qq+2Mk1uXQcHawQ=", "bKiGKZS64f9e+wQoLRqpzFVbrkeO/6N/kpWUEwM+bLI=", "/Q1nNpDG9iD0ulTSTyLRXFnikbCWYrL5kYAMpQUEhdc=", "8YtA6esnwhYNToQHKviBDjpSfqvK/mfLz+EsssYTWn8=", "q+oXvWG+YHJA+WdpBZ0QMio1HFiONnAs8aem0JC25s0=", "acARlmUEI/ilwZYb+Mzp7WTIHbRxc4Uq6W31NJMerGE=", "MC01gXJSrnlzbazj6jWu0VT/SbErCPqifv1SgI2Y5NA=", "v5bNgo3brkchGepFKkBVkphJg1O34wlJFPocnCXZTTQ=", "8sCSZz7FmmBHUWFdlnCyzB3fokFfEspN4d5M1mWdBxQ=", "6x1FFXpGFW/oxWPUgn2oKhxqujsz9dHtwwbkbLg6GPc=", "v8KvSkJ6zxaRzOHC+yJ6zqRXHP6ClFYV0M8gVecB324=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n57699998\niiG/VXe8ooszx44pun2CVoicJ+ebtd2c9QWcIaXumek=\n\n— rekor.sigstore.dev wNI9ajBFAiB/xVXV9CXJXw8msjKcNAv2oYdsGi9DbtRj8fI1NcoouwIhAIYZOwpvwAtyfWxa/5Pkv6/NN9Jdf32JxpqF2EhHxPoi\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiYzdmOTRkZTI5YTgwYjdhODk2ZjVkMzk1MTIxMDFiNjAwNzMzMTk1MDM4OTgxZDRjODk3OWFmMDlhZGFlZmM5ZiJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6Ijc3NDc4MzhmNmEyYWU5NTMwODA2YWEwZTZlNTM5NTk5MTQ0OTk4OWM0NWJlZTY1NTU4ZjEzMGNkOGU4NmM0NjYifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lEdGFwbFIvaWVOMitYZU5KbzlVczdhVFZiMFRkZk83OFRiSnNINk9wc0pvQWlFQXh2bmpOeExUVnY1dDZoMlZoZGJRWUJ6djJCOHZ4NWQ2cFpUM1gyaVFqY0k9IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYVZFTkRRblY1WjBGM1NVSkJaMGxWVDFGSmQzVk1VMjU2TjIxQ1J5OWhRMUpUWlVoTVUyZE5SalZ2ZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZSWGROUkdkM1RucFJlbGRvWTA1TmFsVjNUWHBGZDAxRVozaE9lbEY2VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVmthbEp5UkhaUmFGRllSRFJxUWtNcllXeDNOblpDTm01NE0wdHZjRnBFV0c0cmNtMEtUWGh0Wm05M1ZtOW5iekZYUVVSTVpFWmlVbXRNWlhnMFIzUnRUMVZOT0VVMU9UYzJla0ZsZWt0NU9VZHJVbmRvUWt0UFEwSm5jM2RuWjFsSVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVk9UakkwQ2tWclZrOXBSVE51YkVkR2NIQjFiRkJXU1hKalVtVTRkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRaM2RPYW1jMUNrMTZVVEZaYlZwc1RUSkZNRnBVWTNoWmFsRXdUMFJXYWxsVVRYZGFSMGt5V1ZSTmQwOUVSVEJhVjBab1RsUkplRTFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm5kMDVxWnpWTmVsRXhXVzFhYkUweVJUQmFWR040V1dwUk1FOUVWbXBaVkUxM1drZEpNbGxVVFhkUFJFVXdXbGRHYUU1VVNYaE5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlOUkZrMENrOVVUVEJPVjBwdFdsUk9hRTVIVlROTlYwa3dUa1JuTVZreVJYcE5SMUpwVG0xRmVrMUVaM2hPUjFab1dWUlZlVTFVUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVE5PVkdzeVRXcG5NRTVVWjNaWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhV2RaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamhDU0c5QlpVRkNNa0ZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1dEaFpZM1ZWUVVGQlVVUkJSV04zVWxGSmFFRk9XRFE0TUdKM1IwRlFWMFIzYm5Cd1NHUTVDbmxQYjFWQ09ISXlObEZKTDIxQlNVSXZTREU0YWtGQlJVRnBRVWNyWlhRclIwWnNWMEZhTlhGNVMwVkVaVlZTUmk5NVVpOXVWMnA0UXpCMFIwOWFhelVLZFdaT2VYQnFRVXRDWjJkeGFHdHFUMUJSVVVSQmQwNXVRVVJDYTBGcVFsQkxlRWR2V2pGbVRqbGlVV3RrZFZGVFpUSjRVRGRTZVVKdWVXVnBiRmRTWXdwa1p6VnNOMDAzZG5wbE5rTlhiVmxaTkdNMGJ6VTBiVkJQTVVWaGVHMVZRMDFFTjJsMGJFaDBRMWR3V2tvdlVHczJNRU54YWprMU5VaERiRzlCVGtFekNteEdOVTVSWkUxdE5DOTVhazVrWW1WS2NYSnJPRWcxYm1SalJ5dE1UVVpGWjFFOVBRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWEwLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiMWRhODg5ODhkNjcxZTlmMjg1NzAxNzEyMWQ1YjY0MmMwMTE2MjAwODQwNWQ0MTE0MDVlYmU2ZGY1MGZlZmU5MCJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWEwLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJiYTI0YmY1Njg3MWJlMmZlZjQzNTA5ZmEwZDRmMjFmMmFkMzAxMTZiZDRlMGUxYzgxN2NmNTVjNDllZDlmYWQ4In19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiMDY4OTM0NWJmZTNhNGU3MWI0NDg1Y2EzMGRiNmEzMDgxNGVhYTUyMSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEzLCJmb3Jrc19jb3VudCI6NDEzLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjQ5LCJvcGVuX2lzc3Vlc19jb3VudCI6NDksIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0wOVQyMDo0NzoyMloiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTcyODksInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAwMiwic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0wOVQxOTowNTozMFoiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAwMiwid2F0Y2hlcnNfY291bnQiOjMwMDIsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzNzU5NjI4NDU4IiwiZ2l0aHViX3J1bl9udW1iZXIiOiIxOTIiLCJnaXRodWJfc2hhMSI6IjA2ODkzNDViZmUzYTRlNzFiNDQ4NWNhMzBkYjZhMzA4MTRlYWE1MjEifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM3NTk2Mjg0NTgtMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6IjA2ODkzNDViZmUzYTRlNzFiNDQ4NWNhMzBkYjZhMzA4MTRlYWE1MjEifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEUCIDtaplR/ieN2+XeNJo9Us7aTVb0TdfO78TbJsH6OpsJoAiEAxvnjNxLTVv5t6h2VhdbQYBzv2B8vx5d6pZT3X2iQjcI="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a1/multiple.intoto.jsonl b/provenance/3.8.1a1/multiple.intoto.jsonl
new file mode 100644
index 00000000000..c167e44d52c
--- /dev/null
+++ b/provenance/3.8.1a1/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZjCCBuugAwIBAgIUPuF62MoIGEjf0+ky61UGViahR0IwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzExMDgwODA4WhcNMjUwMzExMDgxODA4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaeiq/P3CdBfkw7tIESqQw6p59ajMQeVlfmm/o3KI7M52HUL/pkF01YoGp6TfWuBFo4iOZLBKEE5wluFHwQMx7KOCBgowggYGMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU3u8LQPIFaxxmJHaxvQaHwgoOWckwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChkMWM4YmY5MTg3NTM0ZTQxMzQ3ZWMxYjM3YTlmZjIzNmU0YzczZDRlMBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDChkMWM4YmY5MTg3NTM0ZTQxMzQ3ZWMxYjM3YTlmZjIzNmU0YzczZDRlMCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoZDFjOGJmOTE4NzUzNGU0MTM0N2VjMWIzN2E5ZmYyMzZlNGM3M2Q0ZTAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM3ODMwNzUyNjgvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlYQ/MJwAAAQDAEYwRAIgOkOcKoGP575N5G8G6LvwXTX/6XbkvFF2c3g6pimm+ucCIHHwVnrAAyYiPEkLSHpJtLiUz0n1muc7hrG9/aXzSPBhMAoGCCqGSM49BAMDA2kAMGYCMQCqsqe2G7qLRTI+qhRsWtQ8OfcrMcQg26e6/guElJtPjs9rez4RUyr5HazdneeBOY0CMQC6vPOBj2OaZYh6SjDjdrDB5G/k4Aj63Vzb7aReCRVTArhcMvR5W0gV/wrAsq44eTk="}, "tlogEntries":[{"logIndex":"180110079", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1741680488", "inclusionPromise":{"signedEntryTimestamp":"MEUCIBaTGSVLya4UY1hfHDVOEh8nf7x/QS41wrq2RzredKuaAiEA5a4i3ojZjCFaun2WdjwfmIBgiBBJMuLXkmWKgyYoCJ8="}, "inclusionProof":{"logIndex":"58205817", "rootHash":"5+tuhOhmscFvEboEApbgy07dS3fXh7/0yXbTrENu37Q=", "treeSize":"58205818", "hashes":["JfYLSJmki/bscMKJFsMlU5QCr4G/1cEVrq3wAzLEN4M=", "4UAOT69K5ibN8H/2KokAdtTCTkOLd4rVa+t+uttPmiw=", "yAR+SX81Cd9rK3PouakBrkhzE6Pj8G+Hqg2lAwH+6eA=", "gTWFDFEPW+wf5o9D82ya79OBSfylWSIPH8jtqBPJm5E=", "Y9QUvY82x5bHuv0/3+hQoH0GPnuY1DXjZMtNGF6IupA=", "3wB18z7lXBsKFRkg9JjeMA6CbiuxBNaT5twN2fpWzG4=", "K9r6pUgnVpJ4bqqSCxqQ+rxN94S/EGcQhyKvzMY4c+s=", "pfdWoPiA31tCCcSkrM+rJO0aYO6Of3NyBYYossmpOVs=", "5xtpUXJVj+CBoaeVAB9dr91uffQKtWCpoMvXNfhSBJg=", "8sCSZz7FmmBHUWFdlnCyzB3fokFfEspN4d5M1mWdBxQ=", "6x1FFXpGFW/oxWPUgn2oKhxqujsz9dHtwwbkbLg6GPc=", "v8KvSkJ6zxaRzOHC+yJ6zqRXHP6ClFYV0M8gVecB324=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n58205818\n5+tuhOhmscFvEboEApbgy07dS3fXh7/0yXbTrENu37Q=\n\n— rekor.sigstore.dev wNI9ajBFAiEAtwDDKMie1YofOsVdZ2ZOBuOWvDqmwy/9kyInl3kQgLYCIAVr9nrBB0qDNz+NmZY8g04Yjkp63CRNqEvLEyBX9J/Y\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiMDVhNjI5N2U0ZTBiNWJkOWM2ZDQxOGY1ZDdlYWRlNTNmNjFhYzYzMDA4NjUzMTIyMDZiODEyOTliYzM4NjdmMiJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjAyZTg2MDExYWRmOTNlZjU1OGViYzBhZDE1NThkMDk3YmE0ZDZmOTY1MTAyMTYwODcyNzkxODlkZTMxMTk5YTAifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVRQ0lBRjMzVHNHTlFGcmtNcWpjVDZFelVoQ0w3QUNXREJLTUFFTkZueko0dmswQWlCVjUwY0N5QTBoRHFXYjdNVStxK2lMamxCWW9ZdU9mcFdiV3RvNHNRNnp2UT09IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYWFrTkRRblYxWjBGM1NVSkJaMGxWVUhWR05qSk5iMGxIUldwbU1DdHJlVFl4VlVkV2FXRm9VakJKZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZSWGhOUkdkM1QwUkJORmRvWTA1TmFsVjNUWHBGZUUxRVozaFBSRUUwVjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVmhaV2x4TDFBelEyUkNabXQzTjNSSlJWTnhVWGMyY0RVNVlXcE5VV1ZXYkdadGJTOEtiek5MU1RkTk5USklWVXd2Y0d0R01ERlpiMGR3TmxSbVYzVkNSbTgwYVU5YVRFSkxSVVUxZDJ4MVJraDNVVTE0TjB0UFEwSm5iM2RuWjFsSFRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVXpkVGhNQ2xGUVNVWmhlSGh0U2toaGVIWlJZVWgzWjI5UFYyTnJkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRhR3ROVjAwMENsbHRXVFZOVkdjelRsUk5NRnBVVVhoTmVsRXpXbGROZUZscVRUTlpWR3h0V21wSmVrNXRWVEJaZW1ONldrUlNiRTFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm9hMDFYVFRSWmJWazFUVlJuTTA1VVRUQmFWRkY0VFhwUk0xcFhUWGhaYWsweldWUnNiVnBxU1hwT2JWVXdXWHBqZWxwRVVteE5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlhUkVacUNrOUhTbTFQVkVVMFRucFZlazVIVlRCTlZFMHdUakpXYWsxWFNYcE9Na1UxV20xWmVVMTZXbXhPUjAwelRUSlJNRnBVUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVE5QUkUxM1RucFZlVTVxWjNaWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhVkZaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamRDU0d0QlpIZENNVUZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1dWRXZUVXAzUVVGQlVVUkJSVmwzVWtGSlowOXJUMk5MYjBkUU5UYzFUalZIT0VjMlRIWjNDbGhVV0M4MldHSnJka1pHTW1Nelp6WndhVzF0SzNWalEwbElTSGRXYm5KQlFYbFphVkJGYTB4VFNIQktkRXhwVlhvd2JqRnRkV00zYUhKSE9TOWhXSG9LVTFCQ2FFMUJiMGREUTNGSFUwMDBPVUpCVFVSQk1tdEJUVWRaUTAxUlEzRnpjV1V5UnpkeFRGSlVTU3R4YUZKelYzUlJPRTltWTNKTlkxRm5NalpsTmdvdlozVkZiRXAwVUdwek9YSmxlalJTVlhseU5VaGhlbVJ1WldWQ1Qxa3dRMDFSUXpaMlVFOUNhakpQWVZwWmFEWlRha1JxWkhKRVFqVkhMMnMwUVdvMkNqTldlbUkzWVZKbFExSldWRUZ5YUdOTmRsSTFWekJuVmk5M2NrRnpjVFEwWlZSclBRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWExLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiNTA1YzYxZGI3YjE1MjljYWY1ZTE0ZDRlMzYxN2VmNDZkZTZmZGU5ODI1YjUzZjViMWQ3NGVhN2M5YmQ2ZjNmMyJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWExLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiIxOTMzNzhlZDcxN2RiYWFhYzI1ODEzNjM1MzVmOGUzNDcyMzdkNzM4MWIzMDRiYTkxN2EwOTJiNTk2YTZhMDJiIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiZDFjOGJmOTE4NzUzNGU0MTM0N2VjMWIzN2E5ZmYyMzZlNGM3M2Q0ZSJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEzLCJmb3Jrc19jb3VudCI6NDEzLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjUzLCJvcGVuX2lzc3Vlc19jb3VudCI6NTMsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0xMFQyMDozNToxNFoiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTU3MTgsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAwMiwic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0xMFQxMDo0Njo1MVoiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAwMiwid2F0Y2hlcnNfY291bnQiOjMwMDIsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzNzgzMDc1MjY4IiwiZ2l0aHViX3J1bl9udW1iZXIiOiIxOTMiLCJnaXRodWJfc2hhMSI6ImQxYzhiZjkxODc1MzRlNDEzNDdlYzFiMzdhOWZmMjM2ZTRjNzNkNGUifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM3ODMwNzUyNjgtMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6ImQxYzhiZjkxODc1MzRlNDEzNDdlYzFiMzdhOWZmMjM2ZTRjNzNkNGUifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEQCIAF33TsGNQFrkMqjcT6EzUhCL7ACWDBKMAENFnzJ4vk0AiBV50cCyA0hDqWb7MU+q+iLjlBYoYuOfpWbWto4sQ6zvQ=="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a10/multiple.intoto.jsonl b/provenance/3.8.1a10/multiple.intoto.jsonl
new file mode 100644
index 00000000000..9146fd0ea28
--- /dev/null
+++ b/provenance/3.8.1a10/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHeDCCBv6gAwIBAgIUYGfozkUN4wTkOEyAt1F8xwi4hNswCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzI0MDkyMDAxWhcNMjUwMzI0MDkzMDAxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEh7aZANZe582/Jo85HICI39nu4WOBaImRk8DPW1sihlr2TOfP6iPdCkUAJG2iMJcStgAQGr4IDo3KUZl6x6LtpaOCBh0wggYZMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU0Y4apWV9PvdzYlQ7JHABdACNRuswHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAfBgorBgEEAYO/MAECBBF3b3JrZmxvd19kaXNwYXRjaDA2BgorBgEEAYO/MAEDBCgyMTg2OTIwZTdkZmQwMmQyMjZhY2NhMDQ2YzlmZTJhY2MzODY4ZWM3MBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDCgyMTg2OTIwZTdkZmQwMmQyMjZhY2NhMDQ2YzlmZTJhY2MzODY4ZWM3MCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoMjE4NjkyMGU3ZGZkMDJkMjI2YWNjYTA0NmM5ZmUyYWNjMzg2OGVjNzAhBgorBgEEAYO/MAEUBBMMEXdvcmtmbG93X2Rpc3BhdGNoMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTQwMzE0MTk0NTYvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlcdzqh8AAAQDAEcwRQIhAK6xpyeheWCW4i5ciJ0HH1NG7pT+PM/VsWaSx/WUMHESAiAPgWc3OV2J0BayEqaI8l8fnWG/a+cok4mJMLYppHeqbjAKBggqhkjOPQQDAwNoADBlAjEA/2qUO6F4mtO2P8V0NnRZBSmZKkV/8SNw2W/Ix9RryHCqq31II4S/TeY8+mi+DsFjAjBJQ2h9iCKLdiLW8gLWmyiv0QdrJHqvhRdhBChbTfyEN3PaewMpXA2KEb1BzTd0VAA="}, "tlogEntries":[{"logIndex":"187089961", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1742808001", "inclusionPromise":{"signedEntryTimestamp":"MEUCIGxmBZ6zXLbmVxR3VyfQsnKthLThT1M9roYOEsjzqrFuAiEA7DcU6P2i/SFSwQvxucII5vF6XtXDcXWbPyQvjNjUyeU="}, "inclusionProof":{"logIndex":"65185699", "rootHash":"LWv92f5WdBGOH5LxxGSDjYvg4RrGaZuXmstE3O1aPyk=", "treeSize":"65185701", "hashes":["jTupYTEQsL0QD6dzKVmQ8hNbXTGEOejQFohFWrG+T3A=", "wUOZI+eQ7v4Ypq8e7pO0oDmNa/qtC0S1olBLBnXXddo=", "j7VGbEUntgwm+fskx96ZkN7Jg0h/a1HG1oFDnikUUsc=", "AqvkKLFqB9n9oVi/PTeHG5hmMNgAh33qO7XNmkWTN5A=", "tPDa7togZ+jM46byo2IhBZgRyIxZmXZu/7AZeoAe9p8=", "+wnZ8sfHMPJ0hWx0xlKNxYINpihoQh554dsQxapsaL4=", "mOrhOCnc655emmPYcXW/cEYfDGylvSNSJnykIvhInqQ=", "xTnhJZ4ogfxHF4L4cqgY+/x7z7Ih4Qwl0I5zq/2i+AE=", "5PD/o9lO/AZIzK6VlCrw0r0xMRzK5ClUVntX7BDGZeY=", "xwOrJaXqUSZy2dKywPX7xc7FiBH4lwsHUq+GWik3kzQ=", "RjEeHjYfTfBLNDfnfttW1X4eaX+xZGXEC+EU+tgeuGc=", "tx5iiWjECLK/XOMe3O6Ypt23w/tgsiFBKH7BgAbqQ64=", "V5yK+DEZNmo/DOSKeBtbSMqCabXFwYk8wUVOY2xbE5M=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n65185701\nLWv92f5WdBGOH5LxxGSDjYvg4RrGaZuXmstE3O1aPyk=\n\n— rekor.sigstore.dev wNI9ajBFAiEA3tptVRkm9Bkeinf7WhxjY/YbWTuBeC21hGCRIt55c5YCIHXOYW+XfWI1nWiBtizw5WYVL2jIzk5SEUYXv5M9mD0H\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiMzZiNTE5NTQwYTk5YjYwY2U2NWE3MTcxZjZlMjljNjg1ZTEyYWU3NWQ3MTQ1ZmJhYzE5YmE0NmVjNDhkNzEzNyJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6Ijg5NGU0ZjM4MjRmMjRjNWZmMTdmMWQwOWViYjRkNTAzM2U2OTE3ZDM0ZTI0N2JiNzMwMGJhMzBmNzI0NjUxNjkifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVRQ0lDSVBTQk81T3pWWmNLOVlDbkdPcElXQmU3WCs2MEtxK0xYZVg4WGNhL3VkQWlCSmVwK1ZpanVkVVA0cmhLUmVhV0JNblpQR2p6bjF1a0xHeXl0V042WVpNdz09IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VobFJFTkRRblkyWjBGM1NVSkJaMGxWV1VkbWIzcHJWVTQwZDFSclQwVjVRWFF4UmpoNGQyazBhRTV6ZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZTVEJOUkd0NVRVUkJlRmRvWTA1TmFsVjNUWHBKTUUxRWEzcE5SRUY0VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVm9OMkZhUVU1YVpUVTRNaTlLYnpnMVNFbERTVE01Ym5VMFYwOUNZVWx0VW1zNFJGQUtWekZ6YVdoc2NqSlVUMlpRTm1sUVpFTnJWVUZLUnpKcFRVcGpVM1JuUVZGSGNqUkpSRzh6UzFWYWJEWjROa3gwY0dGUFEwSm9NSGRuWjFsYVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVXdXVFJoQ25CWFZqbFFkbVI2V1d4Uk4wcElRVUprUVVOT1VuVnpkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCWmtKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUWtZellqTktjbHB0ZUhaa01UbHJZVmhPZDFsWVVtcGhSRUV5UW1kdmNrSm5SVVZCV1U4dkNrMUJSVVJDUTJkNVRWUm5NazlVU1hkYVZHUnJXbTFSZDAxdFVYbE5hbHBvV1RKT2FFMUVVVEpaZW14dFdsUkthRmt5VFhwUFJGazBXbGROTTAxQ2EwY0tRMmx6UjBGUlVVSm5OemgzUVZGUlJVTXhRbmxhVXpGVFdsZDRiRmxZVG14TlJGVkhRMmx6UjBGUlVVSm5OemgzUVZGVlJVb3lSak5qZVRGM1lqTmtiQXBqYmxKMllqSjRla3d6UW5aa01sWjVaRWM1ZG1KSVRYUmlSMFowV1cxU2FFeFlRalZrUjJoMlltcEJaMEpuYjNKQ1owVkZRVmxQTDAxQlJVZENRa3A1Q2xwWFducE1NbWhzV1ZkU2Vrd3lVbXhrYlZaellqTkJkMDkzV1V0TGQxbENRa0ZIUkhaNlFVSkRRVkYwUkVOMGIyUklVbmRqZW05MlRETlNkbUV5Vm5VS1RHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZtbGtXRTVzWTIxT2RtSnVVbXhpYmxGMVdUSTVkRTFKUjBkQ1oyOXlRbWRGUlVGWlR5OU5RVVZLUWtoblRRcGtiV2d3WkVoQ2VrOXBPSFphTW13d1lVaFdhVXh0VG5aaVV6bDZZa2hPYUV4WFdubFpWekZzWkRJNWVXRjVPWHBpU0U1b1RGZGtjR1JIYURGWmFURnVDbHBYTld4amJVWXdZak5KZGt4dFpIQmtSMmd4V1drNU0ySXpTbkphYlhoMlpETk5kbG95Vm5WYVdFcG9aRWM1ZVZneVpHeGliVlo1WVZkT1ptTXllSG9LV1ZSTmRXVlhNWE5SU0Vwc1dtNU5kbVJIUm01amVUa3lUV2swZUV4cVFYZFBRVmxMUzNkWlFrSkJSMFIyZWtGQ1EyZFJjVVJEYUcxT01sSnJUMGROTVFwT1IwMTVUVVJaTTFsdFJtMVpla1Y1V1RKRk0xbFVWVEZPVkdzeFdrUldiRnBVYkdsT2VsVjVUVVJTYUUxQ01FZERhWE5IUVZGUlFtYzNPSGRCVVhORkNrUjNkMDVhTW13d1lVaFdhVXhYYUhaak0xSnNXa1JDUzBKbmIzSkNaMFZGUVZsUEwwMUJSVTFDUkhkTlQyMW9NR1JJUW5wUGFUaDJXakpzTUdGSVZta0tURzFPZG1KVE9XaGtNMDEwWTBjNU0xcFlTakJpTWpselkzazVkMkl6Wkd4amJsSjJZako0ZWt4WGVHaGlWMHByV1ZNeGQyVllVbTlpTWpSM1QwRlpTd3BMZDFsQ1FrRkhSSFo2UVVKRVVWRnhSRU5uZVUxVVp6SlBWRWwzV2xSa2ExcHRVWGROYlZGNVRXcGFhRmt5VG1oTlJGRXlXWHBzYlZwVVNtaFpNazE2Q2s5RVdUUmFWMDB6VFVOSlIwTnBjMGRCVVZGQ1p6YzRkMEZSTkVWR1FYZFRZMjFXYldONU9XOWFWMFpyWTNrNWExcFlXbXhpUnpsM1RVSnJSME5wYzBjS1FWRlJRbWMzT0hkQlVUaEZRM2QzU2sxcVNYaFBWRVUxVFhwak5VMUVSVWREYVhOSFFWRlJRbWMzT0hkQlVrRkZTWGQzYUdGSVVqQmpTRTAyVEhrNWJncGhXRkp2WkZkSmRWa3lPWFJNTWtZelkza3hkMkl6Wkd4amJsSjJZako0ZWsxQ2EwZERhWE5IUVZGUlFtYzNPSGRCVWtWRlEzZDNTazFVU1RWTlZFa3pDazVxVFRSTlNEaEhRMmx6UjBGUlVVSm5OemgzUVZKSlJXTlJlSFpoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1Na1l6WTNreGQySXpaR3dLWTI1U2RtSXllSHBNTTBKMlpESldlV1JIT1haaVNFMTBZa2RHZEZsdFVtaE1XRUkxWkVkb2RtSnBPSFZhTW13d1lVaFdhVXd6WkhaamJYUnRZa2M1TXdwamVUbDNZMjFWZEdOdFZuTmFWMFo2V2xNMU5XSlhlRUZqYlZadFkzazViMXBYUm10amVUbHJXbGhhYkdKSE9YZE5SR2RIUTJselIwRlJVVUpuTnpoM0NrRlNUVVZMWjNkdlRXcEZORTVxYTNsTlIxVXpXa2RhYTAxRVNtdE5ha2t5V1ZkT2FsbFVRVEJPYlUwMVdtMVZlVmxYVG1wTmVtY3lUMGRXYWs1NlFXZ0tRbWR2Y2tKblJVVkJXVTh2VFVGRlZVSkNUVTFGV0dSMlkyMTBiV0pIT1ROWU1sSndZek5DYUdSSFRtOU5SelJIUTJselIwRlJVVUpuTnpoM1FWSlZSUXBaUVhobFlVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKR00yTjVNWGRpTTJSc1kyNVNkbUl5ZUhwTU0wSjJaREpXZVdSSE9YWmlTRTEwQ21KSFJuUlpiVkpvVEZoQ05XUkhhSFppYVRsb1dUTlNjR0l5TlhwTU0wb3hZbTVOZGsxVVVYZE5la1V3VFZSck1FNVVXWFpaV0ZJd1dsY3hkMlJJVFhZS1RWUkJWMEpuYjNKQ1owVkZRVmxQTDAxQlJWZENRV2ROUW01Q01WbHRlSEJaZWtOQ2FXZFpTMHQzV1VKQ1FVaFhaVkZKUlVGblVqaENTRzlCWlVGQ01ncEJUakE1VFVkeVIzaDRSWGxaZUd0bFNFcHNiazUzUzJsVGJEWTBNMnA1ZEM4MFpVdGpiMEYyUzJVMlQwRkJRVUpzWTJSNmNXZzRRVUZCVVVSQlJXTjNDbEpSU1doQlN6WjRjSGxsYUdWWFExYzBhVFZqYVVvd1NFZ3hUa2MzY0ZRclVFMHZWbk5YWVZONEwxZFZUVWhGVTBGcFFWQm5WMk16VDFZeVNqQkNZWGtLUlhGaFNUaHNPR1p1VjBjdllTdGpiMnMwYlVwTlRGbHdjRWhsY1dKcVFVdENaMmR4YUd0cVQxQlJVVVJCZDA1dlFVUkNiRUZxUlVFdk1uRlZUelpHTkFwdGRFOHlVRGhXTUU1dVVscENVMjFhUzJ0V0x6aFRUbmN5Vnk5SmVEbFNjbmxJUTNGeE16RkpTVFJUTDFSbFdUZ3JiV2tyUkhOR2FrRnFRa3BSTW1nNUNtbERTMHhrYVV4WE9HZE1WMjE1YVhZd1VXUnlTa2h4ZG1oU1pHaENRMmhpVkdaNVJVNHpVR0ZsZDAxd1dFRXlTMFZpTVVKNlZHUXdWa0ZCUFFvdExTMHRMVVZPUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2c9PSJ9XX19"}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWExMC1weTMtbm9uZS1hbnkud2hsIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjUwMzFmOTFlYjA2MTA0ODQxMWFiMWFkNmVmYmYwNTA0OGUyZTZhYzYxMGY5MWM1YjU4M2E4Y2U5NTc2YjU3Y2UifX0seyJuYW1lIjoiLi9hd3NfbGFtYmRhX3Bvd2VydG9vbHMtMy44LjFhMTAudGFyLmd6IiwiZGlnZXN0Ijp7InNoYTI1NiI6IjUxMzdhZjQxMWY2YzE4MTYxNTlkNGMwYzg0NDI1MTFlNTE3MTRmYjcxOTNiM2RmNTYzYmFiYzQ1OGRiZGE0ZTcifX1dLCJwcmVkaWNhdGUiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAifSwiYnVpbGRUeXBlIjoiaHR0cHM6Ly9naXRodWIuY29tL3Nsc2EtZnJhbWV3b3JrL3Nsc2EtZ2l0aHViLWdlbmVyYXRvci9nZW5lcmljQHYxIiwiaW52b2NhdGlvbiI6eyJjb25maWdTb3VyY2UiOnsidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiIyMTg2OTIwZTdkZmQwMmQyMjZhY2NhMDQ2YzlmZTJhY2MzODY4ZWM3In0sImVudHJ5UG9pbnQiOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwicGFyYW1ldGVycyI6eyJldmVudF9pbnB1dHMiOnsic2tpcF9jb2RlX3F1YWxpdHkiOiJmYWxzZSIsInNraXBfcHlwaSI6ImZhbHNlIn0sInZhcnMiOm51bGx9LCJlbnZpcm9ubWVudCI6eyJnaXRodWJfYWN0b3IiOiJsZWFuZHJvZGFtYXNjZW5hIiwiZ2l0aHViX2FjdG9yX2lkIjoiNDI5NTE3MyIsImdpdGh1Yl9iYXNlX3JlZiI6IiIsImdpdGh1Yl9ldmVudF9uYW1lIjoid29ya2Zsb3dfZGlzcGF0Y2giLCJnaXRodWJfZXZlbnRfcGF5bG9hZCI6eyJlbnRlcnByaXNlIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2IvMTI5MD92PTQiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xM1QxODowNTo0MVoiLCJkZXNjcmlwdGlvbiI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2VudGVycHJpc2VzL2FtYXpvbiIsImlkIjoxMjkwLCJuYW1lIjoiQW1hem9uIiwibm9kZV9pZCI6Ik1ERXdPa1Z1ZEdWeWNISnBjMlV4TWprdyIsInNsdWciOiJhbWF6b24iLCJ1cGRhdGVkX2F0IjoiMjAyNC0wOS0zMFQyMTowMjozMFoiLCJ3ZWJzaXRlX3VybCI6Imh0dHBzOi8vd3d3LmFtYXpvbi5jb20vIn0sImlucHV0cyI6eyJza2lwX2NvZGVfcXVhbGl0eSI6ImZhbHNlIiwic2tpcF9weXBpIjoiZmFsc2UifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZWYiOiJyZWZzL2hlYWRzL2RldmVsb3AiLCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEyLCJmb3Jrc19jb3VudCI6NDEyLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjUyLCJvcGVuX2lzc3Vlc19jb3VudCI6NTIsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0yM1QxMDowMzo0NloiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6MTAwNDg5LCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjMwMTIsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDMtMjJUMTU6MDQ6MjhaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjMwMTIsIndhdGNoZXJzX2NvdW50IjozMDEyLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzZW5kZXIiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80Mjk1MTczP3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xlYW5kcm9kYW1hc2NlbmEvZXZlbnRzey9wcml2YWN5fSIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xlYW5kcm9kYW1hc2NlbmEvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGVhbmRyb2RhbWFzY2VuYS9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sZWFuZHJvZGFtYXNjZW5hL2dpc3Rzey9naXN0X2lkfSIsImdyYXZhdGFyX2lkIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vbGVhbmRyb2RhbWFzY2VuYSIsImlkIjo0Mjk1MTczLCJsb2dpbiI6ImxlYW5kcm9kYW1hc2NlbmEiLCJub2RlX2lkIjoiTURRNlZYTmxjalF5T1RVeE56TT0iLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGVhbmRyb2RhbWFzY2VuYS9vcmdzIiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGVhbmRyb2RhbWFzY2VuYS9yZWNlaXZlZF9ldmVudHMiLCJyZXBvc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xlYW5kcm9kYW1hc2NlbmEvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2xlYW5kcm9kYW1hc2NlbmEvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9sZWFuZHJvZGFtYXNjZW5hL3N1YnNjcmlwdGlvbnMiLCJ0eXBlIjoiVXNlciIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvbGVhbmRyb2RhbWFzY2VuYSIsInVzZXJfdmlld190eXBlIjoicHVibGljIn0sIndvcmtmbG93IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImdpdGh1Yl9oZWFkX3JlZiI6IiIsImdpdGh1Yl9yZWYiOiJyZWZzL2hlYWRzL2RldmVsb3AiLCJnaXRodWJfcmVmX3R5cGUiOiJicmFuY2giLCJnaXRodWJfcmVwb3NpdG9yeV9pZCI6IjIyMTkxOTM3OSIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyIjoiYXdzLXBvd2VydG9vbHMiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lcl9pZCI6IjEyOTEyNzYzOCIsImdpdGh1Yl9ydW5fYXR0ZW1wdCI6IjEiLCJnaXRodWJfcnVuX2lkIjoiMTQwMzE0MTk0NTYiLCJnaXRodWJfcnVuX251bWJlciI6IjIwMyIsImdpdGh1Yl9zaGExIjoiMjE4NjkyMGU3ZGZkMDJkMjI2YWNjYTA0NmM5ZmUyYWNjMzg2OGVjNyJ9fSwibWV0YWRhdGEiOnsiYnVpbGRJbnZvY2F0aW9uSUQiOiIxNDAzMTQxOTQ1Ni0xIiwiY29tcGxldGVuZXNzIjp7InBhcmFtZXRlcnMiOnRydWUsImVudmlyb25tZW50IjpmYWxzZSwibWF0ZXJpYWxzIjpmYWxzZX0sInJlcHJvZHVjaWJsZSI6ZmFsc2V9LCJtYXRlcmlhbHMiOlt7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiMjE4NjkyMGU3ZGZkMDJkMjI2YWNjYTA0NmM5ZmUyYWNjMzg2OGVjNyJ9fV19fQ==", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEQCICIPSBO5OzVZcK9YCnGOpIWBe7X+60Kq+LXeX8Xca/udAiBJep+VijudUP4rhKReaWBMnZPGjzn1ukLGyytWN6YZMw=="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a11/multiple.intoto.jsonl b/provenance/3.8.1a11/multiple.intoto.jsonl
new file mode 100644
index 00000000000..e7733802172
--- /dev/null
+++ b/provenance/3.8.1a11/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZzCCBu2gAwIBAgIURUcnkqNJniOPgWxrxlX/j6Ufc2YwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzI1MDgwNzMyWhcNMjUwMzI1MDgxNzMyWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE60kU5AUcHbC7kZYowiukkbBOw4WjZStx1HzhAT0uA6G6H3eowTc/CLoEPnQrEkOBwA+N146ZpAWhDBM46yUm3aOCBgwwggYIMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU/Y2HSMFoQ2xvnuJ/MJS3zqLp5MEwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCg0YzBmNTFkNmRkNDdiZWMyMjA4MjIzNWQwOTM0NWQ1ZjU4ODM4MDM5MBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDCg0YzBmNTFkNmRkNDdiZWMyMjA4MjIzNWQwOTM0NWQ1ZjU4ODM4MDM5MCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoNGMwZjUxZDZkZDQ3YmVjMjIwODIyMzVkMDkzNDVkNWY1ODgzODAzOTAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTQwNTQ0NzY4NzQvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBiwYKKwYBBAHWeQIEAgR9BHsAeQB3AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlcxXq1EAAAQDAEgwRgIhAN4uVJCNlfw9rNKwvtQKEA3kwjgjwAP4px+tkLT8GLTrAiEAkho9QpJOdYLmvx/AYwdZoKL2GTGVgT/PS6XFgsm97k8wCgYIKoZIzj0EAwMDaAAwZQIwLCJHile3G8tVFMoqnTOYYjxpM7jo1AuLrQRqIMPdVGXQWoEHbtUSEGWlX24r5Z+bAjEAj16GPwp9HKnh8laQbIfenmG2zgmBTeqGIQEAP5PAf7KcjSxxwPeMBMJP95rs96Bv"}, "tlogEntries":[{"logIndex":"187653012", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1742890052", "inclusionPromise":{"signedEntryTimestamp":"MEUCIAjYBcaDSv7AAOAV53vU2UQ/2vPViWXZpKzFYm5SHmWVAiEA3md70/yVZUF521cA4OrWqj/ioIlHUYNp8no8Gd58pME="}, "inclusionProof":{"logIndex":"65748750", "rootHash":"O9MTpsJiVFPjBp3dHxgCw8A4MzN2g7J6EjOdkxVYa3U=", "treeSize":"65748752", "hashes":["B53375f4HT4SUVicTjNNNdp5f7BQEEK1NA+6jh3dBHc=", "BLPmt0NOuRB/R3l2puqax3lyxxb9q+SVSuYQozIsNcU=", "+GXbNtWbHwfhmtkmYENf+aIP4IoQhQkvj5omwzabTuU=", "dNWfv1uiaKCdb6NK5u5nNW0eDqQAs1R6xUydE4u8qn4=", "DdDPiJtGxZP5Yoqp6Ste6ke1NOBok6xHr9TOkRRSvyo=", "lS2fPcW6w8KykGpbyRAKnHzZF+5CGfXaImOkgNEqIGI=", "CVcPSVikt5LLXii0vubl6gKIPmC5KZvGr6PIq3nmZPw=", "VmeIXVxcfovbzEKPtpP6RIqAJ9/qQtAR7d6dzBat+s0=", "4NOSygXFChceJuU19YXyI7x1fvPdR00VXh/FgECfVEo=", "VL2xV/9kKWKLswbK5TTw5FmTi6cS6OnrFuJ4rNOJ8W4=", "MrO4MRTdBBOxrqOL2HAfsAHW/VpM7mdirxcH16PZ5Z4=", "cNCz4X3z1t8csPufDgWg4uFRmk5mP7wl7sDPOdgjcSE=", "fVhfycGovHc9MAwgcy+hFmhNVydxXg2WidANM9QJChg=", "tx5iiWjECLK/XOMe3O6Ypt23w/tgsiFBKH7BgAbqQ64=", "V5yK+DEZNmo/DOSKeBtbSMqCabXFwYk8wUVOY2xbE5M=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n65748752\nO9MTpsJiVFPjBp3dHxgCw8A4MzN2g7J6EjOdkxVYa3U=\n\n— rekor.sigstore.dev wNI9ajBFAiEAzXfVLskX+NQyQj/tPybQyl0NCJc9DLJ2FcUsk5FbwFwCICckbaf6GLXVSliOy9MZwEo8h87MaiJix8SbxLbFaFWi\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiYTg0ZDk3NmI4YTI1ZDk2YWNiNjdhNDc5Mjk3Y2FhNzg4NWJkMGIyMmFhOGI2YTUxYjliZThjMzAxZDNlMjE0YSJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6ImZlNzNjYjA3NGJiNzJhMDQ0NDcwNmNkOWI5ZmZkZjUwYTQ5YjBkM2Q2NmEwZjliMTMwOTY5NmI4MzMxZDBhYjkifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVZQ0lRRGZ3RC93TGpKdkpMVU5RejYwT09UYWJva3NHRGtaakYycHVqODBJRHEyMEFJaEFNYWdaemdwbml4bXNjeGxSVFZQcExsNXdFSFgrZTNXVU9ZdWNwdlU3a1JEIiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYWVrTkRRblV5WjBGM1NVSkJaMGxWVWxWamJtdHhUa3B1YVU5UVoxZDRjbmhzV0M5cU5sVm1ZekpaZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZTVEZOUkdkM1RucE5lVmRvWTA1TmFsVjNUWHBKTVUxRVozaE9lazE1VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVTJNR3RWTlVGVlkwaGlRemRyV2xsdmQybDFhMnRpUWs5M05GZHFXbE4wZURGSWVtZ0tRVlF3ZFVFMlJ6WklNMlZ2ZDFSakwwTk1iMFZRYmxGeVJXdFBRbmRCSzA0eE5EWmFjRUZYYUVSQ1RUUTJlVlZ0TTJGUFEwSm5kM2RuWjFsSlRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVXZXVEpJQ2xOTlJtOVJNbmgyYm5WS0wwMUtVek42Y1V4d05VMUZkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRaekJaZWtKdENrNVVSbXRPYlZKclRrUmthVnBYVFhsTmFrRTBUV3BKZWs1WFVYZFBWRTB3VGxkUk1WcHFWVFJQUkUwMFRVUk5OVTFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm5NRmw2UW0xT1ZFWnJUbTFTYTA1RVpHbGFWMDE1VFdwQk5FMXFTWHBPVjFGM1QxUk5NRTVYVVRGYWFsVTBUMFJOTkUxRVRUVk5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlPUjAxM0NscHFWWGhhUkZwcldrUlJNMWx0Vm1wTmFrbDNUMFJKZVUxNlZtdE5SR3Q2VGtSV2EwNVhXVEZQUkdkNlQwUkJlazlVUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVVWGRPVkZFd1RucFpORTU2VVhaWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhWGRaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamxDU0hOQlpWRkNNMEZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1kzaFljVEZGUVVGQlVVUkJSV2QzVW1kSmFFRk9OSFZXU2tOT2JHWjNPWEpPUzNkMmRGRkxDa1ZCTTJ0M2FtZHFkMEZRTkhCNEszUnJURlE0UjB4VWNrRnBSVUZyYUc4NVVYQktUMlJaVEcxMmVDOUJXWGRrV205TFRESkhWRWRXWjFRdlVGTTJXRVlLWjNOdE9UZHJPSGREWjFsSlMyOWFTWHBxTUVWQmQwMUVZVUZCZDFwUlNYZE1RMHBJYVd4bE0wYzRkRlpHVFc5eGJsUlBXVmxxZUhCTk4ycHZNVUYxVEFweVVWSnhTVTFRWkZaSFdGRlhiMFZJWW5SVlUwVkhWMnhZTWpSeU5Wb3JZa0ZxUlVGcU1UWkhVSGR3T1VoTGJtZzRiR0ZSWWtsbVpXNXRSeko2WjIxQ0NsUmxjVWRKVVVWQlVEVlFRV1kzUzJOcVUzaDRkMUJsVFVKTlNsQTVOWEp6T1RaQ2Rnb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWExMS1weTMtbm9uZS1hbnkud2hsIiwiZGlnZXN0Ijp7InNoYTI1NiI6IjkyYWE3NGNiY2E3N2MyN2Q0N2QxNjI2ZmQ0ZWExNDBmYTBiYzM3YjAyOGRiZTAzNzNkZDQxOWUwOGJjMzkyNTkifX0seyJuYW1lIjoiLi9hd3NfbGFtYmRhX3Bvd2VydG9vbHMtMy44LjFhMTEudGFyLmd6IiwiZGlnZXN0Ijp7InNoYTI1NiI6Ijc4MmQ1OTMwMGNlYjI3MzRlMDQ4OTg0ZWI2MzI5YjJlMGQ4MWVhOWE5MWZmZjcyODNlZWM2NTRiYTJkNzg2NjYifX1dLCJwcmVkaWNhdGUiOnsiYnVpbGRlciI6eyJpZCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAifSwiYnVpbGRUeXBlIjoiaHR0cHM6Ly9naXRodWIuY29tL3Nsc2EtZnJhbWV3b3JrL3Nsc2EtZ2l0aHViLWdlbmVyYXRvci9nZW5lcmljQHYxIiwiaW52b2NhdGlvbiI6eyJjb25maWdTb3VyY2UiOnsidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiI0YzBmNTFkNmRkNDdiZWMyMjA4MjIzNWQwOTM0NWQ1ZjU4ODM4MDM5In0sImVudHJ5UG9pbnQiOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZW52aXJvbm1lbnQiOnsiZ2l0aHViX2FjdG9yIjoibGVhbmRyb2RhbWFzY2VuYSIsImdpdGh1Yl9hY3Rvcl9pZCI6IjQyOTUxNzMiLCJnaXRodWJfYmFzZV9yZWYiOiIiLCJnaXRodWJfZXZlbnRfbmFtZSI6InNjaGVkdWxlIiwiZ2l0aHViX2V2ZW50X3BheWxvYWQiOnsiZW50ZXJwcmlzZSI6eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS9iLzEyOTA/dj00IiwiY3JlYXRlZF9hdCI6IjIwMTktMTEtMTNUMTg6MDU6NDFaIiwiZGVzY3JpcHRpb24iOiIiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9lbnRlcnByaXNlcy9hbWF6b24iLCJpZCI6MTI5MCwibmFtZSI6IkFtYXpvbiIsIm5vZGVfaWQiOiJNREV3T2tWdWRHVnljSEpwYzJVeE1qa3ciLCJzbHVnIjoiYW1hem9uIiwidXBkYXRlZF9hdCI6IjIwMjQtMDktMzBUMjE6MDI6MzBaIiwid2Vic2l0ZV91cmwiOiJodHRwczovL3d3dy5hbWF6b24uY29tLyJ9LCJvcmdhbml6YXRpb24iOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMjkxMjc2Mzg/dj00IiwiZGVzY3JpcHRpb24iOiIiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2V2ZW50cyIsImhvb2tzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ob29rcyIsImlkIjoxMjkxMjc2MzgsImlzc3Vlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaXNzdWVzIiwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm1lbWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL21lbWJlcnN7L21lbWJlcn0iLCJub2RlX2lkIjoiT19rZ0RPQjdKVTFnIiwicHVibGljX21lbWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL3B1YmxpY19tZW1iZXJzey9tZW1iZXJ9IiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL3JlcG9zIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzIn0sInJlcG9zaXRvcnkiOnsiYWxsb3dfZm9ya2luZyI6dHJ1ZSwiYXJjaGl2ZV91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi97YXJjaGl2ZV9mb3JtYXR9ey9yZWZ9IiwiYXJjaGl2ZWQiOmZhbHNlLCJhc3NpZ25lZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vYXNzaWduZWVzey91c2VyfSIsImJsb2JzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9ibG9ic3svc2hhfSIsImJyYW5jaGVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2JyYW5jaGVzey9icmFuY2h9IiwiY2xvbmVfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJjb2xsYWJvcmF0b3JzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbGxhYm9yYXRvcnN7L2NvbGxhYm9yYXRvcn0iLCJjb21tZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb21tZW50c3svbnVtYmVyfSIsImNvbW1pdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWl0c3svc2hhfSIsImNvbXBhcmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tcGFyZS97YmFzZX0uLi57aGVhZH0iLCJjb250ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250ZW50cy97K3BhdGh9IiwiY29udHJpYnV0b3JzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbnRyaWJ1dG9ycyIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTE1VDEyOjI2OjEyWiIsImN1c3RvbV9wcm9wZXJ0aWVzIjp7fSwiZGVmYXVsdF9icmFuY2giOiJkZXZlbG9wIiwiZGVwbG95bWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZGVwbG95bWVudHMiLCJkZXNjcmlwdGlvbiI6IkEgZGV2ZWxvcGVyIHRvb2xraXQgdG8gaW1wbGVtZW50IFNlcnZlcmxlc3MgYmVzdCBwcmFjdGljZXMgYW5kIGluY3JlYXNlIGRldmVsb3BlciB2ZWxvY2l0eS4iLCJkaXNhYmxlZCI6ZmFsc2UsImRvd25sb2Fkc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9kb3dubG9hZHMiLCJldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZXZlbnRzIiwiZm9yayI6ZmFsc2UsImZvcmtzIjo0MTMsImZvcmtzX2NvdW50Ijo0MTMsImZvcmtzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2ZvcmtzIiwiZnVsbF9uYW1lIjoiYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwiZ2l0X2NvbW1pdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L2NvbW1pdHN7L3NoYX0iLCJnaXRfcmVmc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvcmVmc3svc2hhfSIsImdpdF90YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC90YWdzey9zaGF9IiwiZ2l0X3VybCI6ImdpdDovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsImhhc19kaXNjdXNzaW9ucyI6dHJ1ZSwiaGFzX2Rvd25sb2FkcyI6dHJ1ZSwiaGFzX2lzc3VlcyI6dHJ1ZSwiaGFzX3BhZ2VzIjpmYWxzZSwiaGFzX3Byb2plY3RzIjp0cnVlLCJoYXNfd2lraSI6ZmFsc2UsImhvbWVwYWdlIjoiaHR0cHM6Ly9kb2NzLnBvd2VydG9vbHMuYXdzLmRldi9sYW1iZGEvcHl0aG9uL2xhdGVzdC8iLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ob29rcyIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImlkIjoyMjE5MTkzNzksImlzX3RlbXBsYXRlIjpmYWxzZSwiaXNzdWVfY29tbWVudF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXMvY29tbWVudHN7L251bWJlcn0iLCJpc3N1ZV9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2V2ZW50c3svbnVtYmVyfSIsImlzc3Vlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9pc3N1ZXN7L251bWJlcn0iLCJrZXlzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2tleXN7L2tleV9pZH0iLCJsYWJlbHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbGFiZWxzey9uYW1lfSIsImxhbmd1YWdlIjoiUHl0aG9uIiwibGFuZ3VhZ2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhbmd1YWdlcyIsImxpY2Vuc2UiOnsia2V5IjoibWl0LTAiLCJuYW1lIjoiTUlUIE5vIEF0dHJpYnV0aW9uIiwibm9kZV9pZCI6Ik1EYzZUR2xqWlc1elpUUXgiLCJzcGR4X2lkIjoiTUlULTAiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL2xpY2Vuc2VzL21pdC0wIn0sIm1lcmdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9tZXJnZXMiLCJtaWxlc3RvbmVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL21pbGVzdG9uZXN7L251bWJlcn0iLCJtaXJyb3JfdXJsIjpudWxsLCJuYW1lIjoicG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uIiwibm9kZV9pZCI6Ik1ERXdPbEpsY0c5emFYUnZjbmt5TWpFNU1Ua3pOems9Iiwibm90aWZpY2F0aW9uc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9ub3RpZmljYXRpb25zez9zaW5jZSxhbGwscGFydGljaXBhdGluZ30iLCJvcGVuX2lzc3VlcyI6NTUsIm9wZW5faXNzdWVzX2NvdW50Ijo1NSwib3duZXIiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMjkxMjc2Mzg/dj00IiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvZXZlbnRzey9wcml2YWN5fSIsImZvbGxvd2Vyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2ZvbGxvd2VycyIsImZvbGxvd2luZ191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2ZvbGxvd2luZ3svb3RoZXJfdXNlcn0iLCJnaXN0c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2dpc3Rzey9naXN0X2lkfSIsImdyYXZhdGFyX2lkIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMiLCJpZCI6MTI5MTI3NjM4LCJsb2dpbiI6ImF3cy1wb3dlcnRvb2xzIiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9vcmdzIiwicmVjZWl2ZWRfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVjZWl2ZWRfZXZlbnRzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInNpdGVfYWRtaW4iOmZhbHNlLCJzdGFycmVkX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3RhcnJlZHsvb3duZXJ9ey9yZXBvfSIsInN1YnNjcmlwdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9zdWJzY3JpcHRpb25zIiwidHlwZSI6Ik9yZ2FuaXphdGlvbiIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMiLCJ1c2VyX3ZpZXdfdHlwZSI6InB1YmxpYyJ9LCJwcml2YXRlIjpmYWxzZSwicHVsbHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vcHVsbHN7L251bWJlcn0iLCJwdXNoZWRfYXQiOiIyMDI1LTAzLTI0VDIxOjQwOjM5WiIsInJlbGVhc2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3JlbGVhc2Vzey9pZH0iLCJzaXplIjoxMDA4NTMsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAxMiwic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0yNFQxMTowMzo0MFoiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAxMiwid2F0Y2hlcnNfY291bnQiOjMwMTIsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjE0MDU0NDc2ODc0IiwiZ2l0aHViX3J1bl9udW1iZXIiOiIyMDQiLCJnaXRodWJfc2hhMSI6IjRjMGY1MWQ2ZGQ0N2JlYzIyMDgyMjM1ZDA5MzQ1ZDVmNTg4MzgwMzkifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTQwNTQ0NzY4NzQtMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6IjRjMGY1MWQ2ZGQ0N2JlYzIyMDgyMjM1ZDA5MzQ1ZDVmNTg4MzgwMzkifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEYCIQDfwD/wLjJvJLUNQz60OOTaboksGDkZjF2puj80IDq20AIhAMagZzgpnixmscxlRTVPpLl5wEHX+e3WUOYucpvU7kRD"}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a2/multiple.intoto.jsonl b/provenance/3.8.1a2/multiple.intoto.jsonl
new file mode 100644
index 00000000000..460b89d824b
--- /dev/null
+++ b/provenance/3.8.1a2/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZzCCBuygAwIBAgIUXDvNjjIibSy7g8w/dqYyQ88qE3QwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzEyMDgwNzM3WhcNMjUwMzEyMDgxNzM3WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESkSp2xQn9Xobk331noQdjgSO9eqEd6myOM/lpYeLA99u4P6r0DKP+lieokz+0UMP/uJAixW/YL+XZeL7MY0HraOCBgswggYHMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQURs2yM2aQ6sP95zEmLMaG5VATdzwwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCg4NTY2NmJiMjNjOWMzNjMzMjYwZWQyMTJjNjllZDFlZDQzZDE5N2M3MBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDCg4NTY2NmJiMjNjOWMzNjMzMjYwZWQyMTJjNjllZDFlZDQzZDE5N2M3MCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoODU2NjZiYjIzYzljMzYzMzI2MGVkMjEyYzY5ZWQxZWQ0M2QxOTdjNzAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM4MDY0MTg2OTkvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlYllEnkAAAQDAEcwRQIhAM4T/yI3Kw67paDD5qy0d4iPAR+TXPE8dd5tW1RL8D0FAiAZPdjTyNC78MwRUb5DdgYrhQRYxrlI8lEi2/kjziVbyjAKBggqhkjOPQQDAwNpADBmAjEAuJDsAl5DAtjrjMyW36eqfo9k1SfZLgxpoxG9B99bBQpLxhg8EoOYlPw3Kc3JzvnLAjEA8yBd/+D1AuAlG7KPimNNwmlJXyfGDB9mGEX+WDFTfkmN2Fc0PNM5hjtOQVQ4HnT9"}, "tlogEntries":[{"logIndex":"180715264", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1741766857", "inclusionPromise":{"signedEntryTimestamp":"MEYCIQCP6TRbKPAa9Dq7oFZOdjEKuuPN4yJjmha90X7pPtVtlAIhAMEX0Pc3xlIYqg8AWIKIy0SfyplGuoWxNcyXmOR0XOop"}, "inclusionProof":{"logIndex":"58811002", "rootHash":"xvC+Ep2+PNHsK9SA1wlHrguB54VkJZ7Mr8AegRAQ3Lg=", "treeSize":"58811005", "hashes":["NEeStcBAVoMN/i5M17d+W9YbHo+Yvnd26aT6kyR9ACA=", "gz+U4S2/8gHPKXW0Wtmqra+Vvo6Uh608d9ZS19QpnH4=", "OqEQKrib2Xeong6ug229dQhhnlU36sxeXh6wtpZ8wtw=", "/GbCz3GIoRBXKvACuHXJMnwElG6l9h9yBj2h9ZxYcF4=", "ktzkmRWE4Km5zq7eQWJNcj6XlDs22w1aNwRW55aT7uQ=", "Th7rp+CATVkEqGX4Ti8Ofcv0Yvyl+SdYIQbSFHf2xkg=", "Fx4PLBMxWqEgg2VoomJ5tvJoG9lyZqfZEnjR/MlmuEs=", "cid8ApsTAqMeRo3ifv14CY+rT3Wx2D5i/D3BRiqm4GI=", "ZHY7disEb0oeGdHCzZZt+gT1bN1Q9FPTqonJvKXProU=", "S9DepSNxl3UP2UlQareNqiKYasZlnQXYvuL7ZCHY2cY=", "jKzsviObHylq3kpGkJo5BdK8N+eLdD7N5D9bSjsjro8=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n58811005\nxvC+Ep2+PNHsK9SA1wlHrguB54VkJZ7Mr8AegRAQ3Lg=\n\n— rekor.sigstore.dev wNI9ajBGAiEAsQParRZdLtyz1bSCDrHMiu6Pt4OjrK6DAcIrrP2NHskCIQCEE2fYSctE1KuGkjeZtYIyfaG5s/Ngj6dpT08eSm34lQ==\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiZGYwY2YwNDUxMDczNDZmYTU2ODE5ZTU3ZTM4Yzk5MDYyZjkzMDBkYTgwYjA1NWE1ODliZTFhOGU3MzE5ODA0ZiJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6ImI2ZWExZjQzOTIyMzY5ZDhkM2NjMmRmYjJlYTA1MmZjZDJjODIyOGZhMjVlYjY2MWQ3MmE3ZmQxMjAyOTUzMjAifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lRRDRsSFFqUllRNmxYYXZiZHIzdzduZ2xTOFdEOVNJZHQ5NnIyNHhnR05xWXdJZ0Nyank0UVd4U2krNVpyaXJyMXZqcXdSZC8yRWRzNVh4ZTVBc3hvdyszVG89IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYWVrTkRRblY1WjBGM1NVSkJaMGxWV0VSMlRtcHFTV2xpVTNrM1p6aDNMMlJ4V1hsUk9EaHhSVE5SZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZSWGxOUkdkM1RucE5NMWRvWTA1TmFsVjNUWHBGZVUxRVozaE9lazB6VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVlRhMU53TW5oUmJqbFliMkpyTXpNeGJtOVJaR3BuVTA4NVpYRkZaRFp0ZVU5Tkwyd0tjRmxsVEVFNU9YVTBVRFp5TUVSTFVDdHNhV1Z2YTNvck1GVk5VQzkxU2tGcGVGY3ZXVXdyV0ZwbFREZE5XVEJJY21GUFEwSm5jM2RuWjFsSVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVlNjeko1Q2sweVlWRTJjMUE1TlhwRmJVeE5ZVWMxVmtGVVpIcDNkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRaelJPVkZreUNrNXRTbWxOYWs1cVQxZE5lazVxVFhwTmFsbDNXbGRSZVUxVVNtcE9hbXhzV2tSR2JGcEVVWHBhUkVVMVRqSk5NMDFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm5ORTVVV1RKT2JVcHBUV3BPYWs5WFRYcE9hazE2VFdwWmQxcFhVWGxOVkVwcVRtcHNiRnBFUm14YVJGRjZXa1JGTlU0eVRUTk5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlQUkZVeUNrNXFXbWxaYWtsNldYcHNhazE2V1hwTmVra3lUVWRXYTAxcVJYbFplbGsxV2xkUmVGcFhVVEJOTWxGNFQxUmthazU2UVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVFJOUkZrd1RWUm5NazlVYTNaWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhV2RaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamhDU0c5QlpVRkNNa0ZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1dXeHNSVzVyUVVGQlVVUkJSV04zVWxGSmFFRk5ORlF2ZVVrelMzYzJOM0JoUkVRMWNYa3dDbVEwYVZCQlVpdFVXRkJGT0dSa05YUlhNVkpNT0VRd1JrRnBRVnBRWkdwVWVVNUROemhOZDFKVllqVkVaR2RaY21oUlVsbDRjbXhKT0d4RmFUSXZhMm9LZW1sV1lubHFRVXRDWjJkeGFHdHFUMUJSVVVSQmQwNXdRVVJDYlVGcVJVRjFTa1J6UVd3MVJFRjBhbkpxVFhsWE16WmxjV1p2T1dzeFUyWmFUR2Q0Y0FwdmVFYzVRams1WWtKUmNFeDRhR2M0Ulc5UFdXeFFkek5MWXpOS2VuWnVURUZxUlVFNGVVSmtMeXRFTVVGMVFXeEhOMHRRYVcxT1RuZHRiRXBZZVdaSENrUkNPVzFIUlZnclYwUkdWR1pyYlU0eVJtTXdVRTVOTldocWRFOVJWbEUwU0c1VU9Rb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWEyLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiZjIxMzdiYjNlZDZlNDk1MzBlNjZkZmI1ZTAxMjBiZjQ4M2QwZmU0MzY2ODk1ZGMzZmFhY2RmYjZjNGE5ZTJmNiJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWEyLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJiOWEzNGVkMjAwNWFmNjQ3MGU1OThhNWNiYTg2YzA1OTZjZmQ4YTk2OWQ2YjU4YjhkMDFiNjM4YTdmMWU2MGFiIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiODU2NjZiYjIzYzljMzYzMzI2MGVkMjEyYzY5ZWQxZWQ0M2QxOTdjNyJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEzLCJmb3Jrc19jb3VudCI6NDEzLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjUxLCJvcGVuX2lzc3Vlc19jb3VudCI6NTEsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0xMVQyMToxNDoxMloiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTU3MzIsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAwMiwic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0xMVQyMToxNDoxNFoiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAwMiwid2F0Y2hlcnNfY291bnQiOjMwMDIsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzODA2NDE4Njk5IiwiZ2l0aHViX3J1bl9udW1iZXIiOiIxOTQiLCJnaXRodWJfc2hhMSI6Ijg1NjY2YmIyM2M5YzM2MzMyNjBlZDIxMmM2OWVkMWVkNDNkMTk3YzcifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM4MDY0MTg2OTktMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6Ijg1NjY2YmIyM2M5YzM2MzMyNjBlZDIxMmM2OWVkMWVkNDNkMTk3YzcifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEUCIQD4lHQjRYQ6lXavbdr3w7nglS8WD9SIdt96r24xgGNqYwIgCrjy4QWxSi+5Zrirr1vjqwRd/2Eds5Xxe5Asxow+3To="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a3/multiple.intoto.jsonl b/provenance/3.8.1a3/multiple.intoto.jsonl
new file mode 100644
index 00000000000..e3fde8714e0
--- /dev/null
+++ b/provenance/3.8.1a3/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZTCCBuugAwIBAgIUG9XzanBSGHCAnjFeU9qZpiqY0w8wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzEzMDgwNzQxWhcNMjUwMzEzMDgxNzQxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEk275br9acZJkHprl00J81TKKbOw6W3scoCGqA3SRT7+Yi0yvoxk5aTA/z/HAGGi8ltx5W9ZGJP4IYlcAkZzOJqOCBgowggYGMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU8mOBEVP0tkxS8jblNtOE49crVuAwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChjMGQ2OTI2MmY1Yjk2MDIwMjQ5ZThmYmY0YzJjOTEzZmM1Mzc3NDAyMBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDChjMGQ2OTI2MmY1Yjk2MDIwMjQ5ZThmYmY0YzJjOTEzZmM1Mzc3NDAyMCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoYzBkNjkyNjJmNWI5NjAyMDI0OWU4ZmJmNGMyYzkxM2ZjNTM3NzQwMjAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM4Mjk3NTAyMjIvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlY6LgL0AAAQDAEYwRAIgMs2EtP4V4ZoojKoMYX0FJbD5ESbDm5KeG1urF7BjZoUCIHyqrjtnfecd9ffQ5T3dsdgXXwIxLSzhS94Fpxl0UaSfMAoGCCqGSM49BAMDA2gAMGUCMBgsfYDiyIo+l1VruCYnFObVA1b2n1HhQNZ4rGDqmQi7Q1DrRn1LPbDaQVzshwm0NAIxANbEM8LL88eSlF/CTYmf/NhHqH8NxEhVCFyKtB244p28tQ3p1idCCo6FmsRyfG8S2w=="}, "tlogEntries":[{"logIndex":"181406495", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1741853262", "inclusionPromise":{"signedEntryTimestamp":"MEUCIC1h6k359MC1NLI6zpAOgDoAhtua19NTqlPyTEAC/jTiAiEA05gAXoCaxFHPpbYhXVhh/BSsoBW3+Ukg5qOlw6nCCJE="}, "inclusionProof":{"logIndex":"59502233", "rootHash":"Qr7XZ7qNZe4EfqdcVYq3yapQpZwEmc+/9RhD36OlrF4=", "treeSize":"59502237", "hashes":["PTbBe00poTNYHh9mIZX/rWvAfStekNaBqnuKV4RKf8c=", "FNWIr1faZyqgLl9gZASkrDUMZvAOuy74+lY1d6ujdF4=", "NZrkK97n35aqF6dKnuv1GuPh1a9ZRrPDgH5TJLXk0p0=", "3Q2bH4/+YqfAr2jYVS67Mhw1S/F3gI/3DcVo928bym8=", "RBa7ayy8fYP5mIqmQVytoebnZ/N7AY0ie9sDMt74K44=", "fAaN1qdpZFiXX8dwTi0SAFKNHrIL8Rjv3gKF3OJHFcs=", "ZuWPpuUv8hbd80XnIp4pJF79kBNG09YPt1bn9p1DM1I=", "JpBQajMRNERW0CjpeRLT6oJtl1DBsU24QNajnG8IVzk=", "GmaWtkdPeNykzlsPSdBgG3BSqTaqlqnEtaYJBpaOA9E=", "YC8ACpUQwlWD0ow/pu2s/6OOzmgnprUreYhThTF7hv8=", "0HeHn8DuFjgQQpUyjFfAlSqRbFKLqR9sCybhLEMUJaI=", "wgdjVTgiJmmvAeOvYt8A/HaEVyz/2A2WFSK3D8bOt0w=", "KLdGQVTaor/L7d9w9qHdfwqDKhiZmhNIHGHXSXnQvbQ=", "XDZG5aLrUtYe5tosgOUIc8lX7ZxvlB21X1PBb3xngKA=", "jI/MXgCzTMlrvzHXfBYiylLZBc4RobHgXf7FY3O09Es=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n59502237\nQr7XZ7qNZe4EfqdcVYq3yapQpZwEmc+/9RhD36OlrF4=\n\n— rekor.sigstore.dev wNI9ajBFAiBRWeJV7ZOHxsspSKqyKVKN7JWF7Doi6RLJfcfv0JxAagIhAIH6S192dQdkY2F/MlyOohPJhWGjRmO3CvaYYghpspne\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiNmE0YmFhMGYwMjAyNWZiNTdiZjgxY2VmODY5YjhiMjk1OGJmYTc2ZDVlNDMyOWZhNjM0YzgwY2ZjODM0MzFkZSJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjQ5MGJlZGY5OTc0ODVlODAyMDA0MzYzMjc1YjIxY2JmZjA3NDkzOGU1NzkwNjFjMDFlMDEyYzM1ODhhODc3ZDAifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lCNWROUExlQmp1U2hmVFhMTG5rckRXbGV6anJpeXBQRGdVbm1rUng2SWM0QWlFQXRUd2pNaHd6VVVva1FMRXF1ZUlvek5icWkrQm8vd1hWbTgvdndFTmZDUG89IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYVZFTkRRblYxWjBGM1NVSkJaMGxWUnpsWWVtRnVRbE5IU0VOQmJtcEdaVlU1Y1Zwd2FYRlpNSGM0ZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZSWHBOUkdkM1RucFJlRmRvWTA1TmFsVjNUWHBGZWsxRVozaE9lbEY0VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVnJNamMxWW5JNVlXTmFTbXRJY0hKc01EQktPREZVUzB0aVQzYzJWek56WTI5RFIzRUtRVE5UVWxRM0sxbHBNSGwyYjNock5XRlVRUzk2TDBoQlIwZHBPR3gwZURWWE9WcEhTbEEwU1Zsc1kwRnJXbnBQU25GUFEwSm5iM2RuWjFsSFRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVTRiVTlDQ2tWV1VEQjBhM2hUT0dwaWJFNTBUMFUwT1dOeVZuVkJkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRhR3BOUjFFeUNrOVVTVEpOYlZreFdXcHJNazFFU1hkTmFsRTFXbFJvYlZsdFdUQlpla3BxVDFSRmVscHRUVEZOZW1NelRrUkJlVTFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm9hazFIVVRKUFZFa3lUVzFaTVZscWF6Sk5SRWwzVFdwUk5WcFVhRzFaYlZrd1dYcEthazlVUlhwYWJVMHhUWHBqTTA1RVFYbE5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlaZWtKckNrNXFhM2xPYWtwdFRsZEpOVTVxUVhsTlJFa3dUMWRWTkZwdFNtMU9SMDE1V1hwcmVFMHlXbXBPVkUwelRucFJkMDFxUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVFJOYW1zelRsUkJlVTFxU1haWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhVkZaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamRDU0d0QlpIZENNVUZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1dUWk1aMHd3UVVGQlVVUkJSVmwzVWtGSlowMXpNa1YwVURSV05GcHZiMnBMYjAxWldEQkdDa3BpUkRWRlUySkViVFZMWlVjeGRYSkdOMEpxV205VlEwbEllWEZ5YW5SdVptVmpaRGxtWmxFMVZETmtjMlJuV0ZoM1NYaE1VM3BvVXprMFJuQjRiREFLVldGVFprMUJiMGREUTNGSFUwMDBPVUpCVFVSQk1tZEJUVWRWUTAxQ1ozTm1XVVJwZVVsdksyd3hWbkoxUTFsdVJrOWlWa0V4WWpKdU1VaG9VVTVhTkFweVIwUnhiVkZwTjFFeFJISlNiakZNVUdKRVlWRldlbk5vZDIwd1RrRkplRUZPWWtWTk9FeE1PRGhsVTJ4R0wwTlVXVzFtTDA1b1NIRklPRTU0UldoV0NrTkdlVXQwUWpJME5IQXlPSFJSTTNBeGFXUkRRMjgyUm0xelVubG1SemhUTW5jOVBRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWEzLXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiYjJmZTNlMzRhYWY1YWFiODI1YzEzZjM5MDQxNGRkZjU2NjFmNWY1OGJmYzQ2YTI2ZTI4OTllZWY1OWFjNWUyMCJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWEzLnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJiYjk3MTI3Y2VmOTBkYTg5ZjRjYjIyMjM3NjJkN2YwNTljMGU1ZjVlMjZjM2Q4ODI2OTE3MjE4M2YwNDkzNjVmIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiYzBkNjkyNjJmNWI5NjAyMDI0OWU4ZmJmNGMyYzkxM2ZjNTM3NzQwMiJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEzLCJmb3Jrc19jb3VudCI6NDEzLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjUyLCJvcGVuX2lzc3Vlc19jb3VudCI6NTIsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0xM1QwMDoyNTozM1oiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTU5NzMsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAwMywic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0xM1QwMDoyNTozN1oiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAwMywid2F0Y2hlcnNfY291bnQiOjMwMDMsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzODI5NzUwMjIyIiwiZ2l0aHViX3J1bl9udW1iZXIiOiIxOTUiLCJnaXRodWJfc2hhMSI6ImMwZDY5MjYyZjViOTYwMjAyNDllOGZiZjRjMmM5MTNmYzUzNzc0MDIifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM4Mjk3NTAyMjItMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6ImMwZDY5MjYyZjViOTYwMjAyNDllOGZiZjRjMmM5MTNmYzUzNzc0MDIifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEUCIB5dNPLeBjuShfTXLLnkrDWlezjriypPDgUnmkRx6Ic4AiEAtTwjMhwzUUokQLEqueIozNbqi+Bo/wXVm8/vwENfCPo="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a4/multiple.intoto.jsonl b/provenance/3.8.1a4/multiple.intoto.jsonl
new file mode 100644
index 00000000000..2acc74fb047
--- /dev/null
+++ b/provenance/3.8.1a4/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZTCCBuygAwIBAgIUXrXGpKjyHD7s3E0VoaivnGhwGiEwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzE0MDgwNzQ2WhcNMjUwMzE0MDgxNzQ2WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjiqA16B1OmL2vuez8yvO0josd+inHENl5b8EfTjfGnWngu+O4MeeFjFXNI2nCz+nKi9D+FrqQ+/0E385KCUmr6OCBgswggYHMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUhoO12Kexw/+AwwbLsiqpzJSB/dMwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCg5NzI0MDQ3MGIwNTgwZjUwNmJmMDQwZDc4MzNhNWQ3MzlhNTBhYTNmMBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDCg5NzI0MDQ3MGIwNTgwZjUwNmJmMDQwZDc4MzNhNWQ3MzlhNTBhYTNmMCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoOTcyNDA0NzBiMDU4MGY1MDZiZjA0MGQ3ODMzYTVkNzM5YTUwYWEzZjAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM4NTIyOTk5MDYvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlZOx7TAAAAQDAEcwRQIgE2gKgJ4MS5wVyK8Ny2z9zDs8kKsY2tsCIPaPZ1+lBTwCIQDUe7hsBw+onHXOU4bb1mKGK06qrmuQo+6CJ5E2N/KPYjAKBggqhkjOPQQDAwNnADBkAjBEWogSIi/5piHU0Ko845hQ/M6LWxHQdS62F6UNi0BbUDDP/kUfCTib+PyM+q/ntVkCMEbYw+Wj566nWboRwkJUkI2Xy+8SU3HblFfWi0ESVAw+3F6aG4YuTW3xiaBPjgJDEQ=="}, "tlogEntries":[{"logIndex":"182111322", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1741939666", "inclusionPromise":{"signedEntryTimestamp":"MEQCIGgeOEv6rJ7G4bVo8e/KEwtwo7+WV9MzyakX38dx6gQ2AiB8znwuLaCAF9uOxEhUZ/u2bENg+ipvM74Ttm1XDsXEmA=="}, "inclusionProof":{"logIndex":"60207060", "rootHash":"hpyTDjLHpowh54lYMWOIfU6WAlHRsBCGa+r6uYqOdpM=", "treeSize":"60207062", "hashes":["fIyVnYqs9rCYBUhvzjgMVLIj8UIOhZbmwJSn6dc29hc=", "hTfxRlmMyJrWjq8L6qzwU3NOsRk0de06PO7YlpmVYyw=", "n/hXhsHyjVIIMhu9esnKXUcxZBWPQOZ2xwZvNa9COjI=", "zrozMr7uLTo4LkZ5/U6Jd1VwloW8YXM3ZoE1uc8ogJk=", "arqRRonPve81fzjQIdyQfKd1Nzg00hAilswGrnQXxbE=", "6cRteJU2WjXRMyV1mKRxApk7TKQB1ky2Us/k2xhzm+A=", "CbtfvVVcpVuxGU69RIT30gwTF3gHpAD7A0DadL0nK5Y=", "a3Lf+jS6MAnzjYCnUurZGNyT5W+Ob+h8gtAXqE42iIg=", "8LyYqtVj002T2hbvdyjjDPM6Dn53DUndNiMwrHY0EKM=", "DbOyO43Hhk4PCFHEU5ozTUZJ5bMkEfG2jfG4LkhAwZE=", "wFVtfC9uYNQuzidDRmjXHbNyp+/DftLUDD3qrRsQ1+E=", "g9TdfQewxTqUiU63QENkX6DOE/fqXrBGooyziw+yDpE=", "vJoMp6KAzn7Rzlkwtp09JZpWKmlmqUDqeAnVYY4NvVg=", "rskMHekPJeIwMzQxTPbr+gmfSofXmwBJv3BsZccoIc0=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n60207062\nhpyTDjLHpowh54lYMWOIfU6WAlHRsBCGa+r6uYqOdpM=\n\n— rekor.sigstore.dev wNI9ajBEAiAmV0JyrIhBcPO/2QG7zMdrQgZK1vuId3Wj8BUCY4M8UQIgE7skLiCepOfmwRSGEL4QiqpjMUaMSQapJ7Ejl26c0vA=\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiYzYxOThhYWI1YTkwODVkZWYxMmYwZWQwZTVjODkwYzBhOGQxZmU5NWJkMDllNTYwY2FmZjQ0YjcyZDZjOTRjMSJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjkyZTEyYzExZGYzYzE4Nzk3MDEyZDJlZGRlMmJhMGU2ZTdkZGQxZjVjNjZjODllYzc5ZWY5ZWQ2YjMwMTkwNzYifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lHSVkwZHB0VW9iZjdDd0M4RURHSGVUTkZzZjVVdjJtYks0S29jUE1lbXN5QWlFQXU4eHR1RTFvK3E4c2x6R2pUTVlyK0JMY0RRMmthdlFxVkh0RVVkaGFZZHM9IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYVZFTkRRblY1WjBGM1NVSkJaMGxWV0hKWVIzQkxhbmxJUkRkek0wVXdWbTloYVhadVIyaDNSMmxGZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZSVEJOUkdkM1RucFJNbGRvWTA1TmFsVjNUWHBGTUUxRVozaE9lbEV5VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVnFhWEZCTVRaQ01VOXRUREoyZFdWNk9IbDJUekJxYjNOa0sybHVTRVZPYkRWaU9FVUtabFJxWmtkdVYyNW5kU3RQTkUxbFpVWnFSbGhPU1RKdVEzb3Jia3RwT1VRclJuSnhVU3N2TUVVek9EVkxRMVZ0Y2paUFEwSm5jM2RuWjFsSVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVm9iMDh4Q2pKTFpYaDNMeXRCZDNkaVRITnBjWEI2U2xOQ0wyUk5kMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRaelZPZWtrd0NrMUVVVE5OUjBsM1RsUm5kMXBxVlhkT2JVcHRUVVJSZDFwRVl6Uk5lazVvVGxkUk0wMTZiR2hPVkVKb1dWUk9iVTFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm5OVTU2U1RCTlJGRXpUVWRKZDA1VVozZGFhbFYzVG0xS2JVMUVVWGRhUkdNMFRYcE9hRTVYVVROTmVteG9UbFJDYUZsVVRtMU5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlQVkdONUNrNUVRVEJPZWtKcFRVUlZORTFIV1RGTlJGcHBXbXBCTUUxSFVUTlBSRTE2V1ZSV2EwNTZUVFZaVkZWM1dWZEZlbHBxUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVFJPVkVsNVQxUnJOVTFFV1haWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhV2RaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamhDU0c5QlpVRkNNa0ZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1drOTROMVJCUVVGQlVVUkJSV04zVWxGSlowVXlaMHRuU2pSTlV6VjNWbmxMT0U1NU1ubzVDbnBFY3poclMzTlpNblJ6UTBsUVlWQmFNU3RzUWxSM1EwbFJSRlZsTjJoelFuY3JiMjVJV0U5Vk5HSmlNVzFMUjBzd05uRnliWFZSYnlzMlEwbzFSVElLVGk5TFVGbHFRVXRDWjJkeGFHdHFUMUJSVVVSQmQwNXVRVVJDYTBGcVFrVlhiMmRUU1drdk5YQnBTRlV3UzI4NE5EVm9VUzlOTmt4WGVFaFJaRk0yTWdwR05sVk9hVEJDWWxWRVJGQXZhMVZtUTFScFlpdFFlVTByY1M5dWRGWnJRMDFGWWxsM0sxZHFOVFkyYmxkaWIxSjNhMHBWYTBreVdIa3JPRk5WTTBoaUNteEdabGRwTUVWVFZrRjNLek5HTm1GSE5GbDFWRmN6ZUdsaFFsQnFaMHBFUlZFOVBRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE0LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiZGY3NWNjMDczODBhZjNjZThlMjQ5NDhjYjc4NjQ4M2E0YmI1YTU5MWRkYWQwMzRlNzI4YjcwZDhjMDJmNDIxMyJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE0LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI5N2MyN2FmZDIwMDQzZGJkNTNiNGY2YjUzYzI0NjQwMzY5MjJjNTkzYTllMDQ4ODljMDkzNTgwOTI1N2QyYjhhIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiOTcyNDA0NzBiMDU4MGY1MDZiZjA0MGQ3ODMzYTVkNzM5YTUwYWEzZiJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEzLCJmb3Jrc19jb3VudCI6NDEzLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjU4LCJvcGVuX2lzc3Vlc19jb3VudCI6NTgsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0xM1QyMDo1MTo0MFoiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTc1MzUsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAwMywic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0xM1QyMDowOToxNloiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAwMywid2F0Y2hlcnNfY291bnQiOjMwMDMsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzODUyMjk5OTA2IiwiZ2l0aHViX3J1bl9udW1iZXIiOiIxOTYiLCJnaXRodWJfc2hhMSI6Ijk3MjQwNDcwYjA1ODBmNTA2YmYwNDBkNzgzM2E1ZDczOWE1MGFhM2YifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM4NTIyOTk5MDYtMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6Ijk3MjQwNDcwYjA1ODBmNTA2YmYwNDBkNzgzM2E1ZDczOWE1MGFhM2YifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEUCIGIY0dptUobf7CwC8EDGHeTNFsf5Uv2mbK4KocPMemsyAiEAu8xtuE1o+q8slzGjTMYr+BLcDQ2kavQqVHtEUdhaYds="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a5/multiple.intoto.jsonl b/provenance/3.8.1a5/multiple.intoto.jsonl
new file mode 100644
index 00000000000..e6c916aa7fa
--- /dev/null
+++ b/provenance/3.8.1a5/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZjCCBuugAwIBAgIUGs6S+g05YWJ2eg2oL2RmKxbnmxwwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzE3MDgwNzMzWhcNMjUwMzE3MDgxNzMzWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEj+8eQgCDbEr6bK0+vIxUowzROjeZQryVZ7N9zZdeyWm6U3mq2cM2L6zSy7EMffHmmCq0Nf+TK7lse3Vc1SLJxqOCBgowggYGMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUFGNgWSaBaFfHx9PcoB2yWx8T0V4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCgyYjMxNGM4YzFjZjc0ZTZkY2E0N2MzYTc4ZTljZTFhMzlhNTljMDk2MBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDCgyYjMxNGM4YzFjZjc0ZTZkY2E0N2MzYTc4ZTljZTFhMzlhNTljMDk2MCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoMmIzMTRjOGMxY2Y3NGU2ZGNhNDdjM2E3OGU5Y2UxYTM5YTU5YzA5NjAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM4OTQzNjY1ODcvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlaMkzdYAAAQDAEYwRAIgXmhDgjJlIbg+9a93sZGsssaz4jmr2grPQ4wn2Khi7eQCICsFunUQV7Fl6OhuC7mi74Lf6doEp0YA+H6+/HeyU8kbMAoGCCqGSM49BAMDA2kAMGYCMQCjB4VQ93EPCs3cdc0Bk2e6uF8YEI6/+vcmJo0gMw5CFiKGAkTVDdBUhIhb/wGrZCACMQDxMowxeuscnWDGC8n9kIe80VjCdFrMefAzXwYwiuC+Q6bkXWDMQCR0cQF/f47d1E4="}, "tlogEntries":[{"logIndex":"183269168", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1742198853", "inclusionPromise":{"signedEntryTimestamp":"MEQCIF9bGU7btGYePhj5R82/wSCN/0HILpyNO1x5dAf01lUXAiBDl6YH90/06DsROsD28Ka7NU2BRCRw0nAY75gVItRUlQ=="}, "inclusionProof":{"logIndex":"61364906", "rootHash":"Yf2sswbmgwdiBwny7wfZX+xhp5nspm7MQShbpgY1xZo=", "treeSize":"61364908", "hashes":["PUjZYm1nA7a9aYg6HcgEqsBOt6gRhHcMfdRV+xE14Jw=", "5M4B8R2B/E2LJ7+8GO216QCV/Fdj4uV2trfZwn5LH3I=", "bMYpTaI0v/mIn0kDw+36UjMxIbGljhn7dOPGrGRBG5M=", "UYR3Un+SSqEsVwVWOgJHDTyPAPiOYmNakYkj15M1FE8=", "6dSqEEoAqXjTg8/8heA/P6ovq7y/tLJ0I6+OlpAviB4=", "r0Cd2DjqP4u0NW+r2pvJ2g9HsAy7x8hKTy5cz2NpQwQ=", "cOBZD2c7BVKyBnH4UjIdGIMDyfPt2im+bRAjP5ROJVA=", "GgtWFiid2XX/FrcW1mpz6FFO8sFDnOajQea0apltyIY=", "OVLPm8KjlXSvs7e4ZeVnYgizquhP7YtOw9nzbfYToQk=", "ET3r32h1L56QFp+MWWIbAYXQpstY49HVTTqqyHFPoJM=", "DhCOFlWg7sjJF60bWB++3gPNiG9b5vpfnp8Fl4uZ8gk=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n61364908\nYf2sswbmgwdiBwny7wfZX+xhp5nspm7MQShbpgY1xZo=\n\n— rekor.sigstore.dev wNI9ajBFAiArfEG3BpUtwnATFuaTFb6YUkVgAgRj9jcQbxNqTecUAwIhANHSoU5kcF1HmngKX+or+F8vF73c1JRLV37g/g0x4PIA\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiZjA4MmI3ZmU3MDNiMTY5YTkwNTlkYjhiM2JhMjEyOGI4OGEyM2Y4ZGMxZDhhZWVjNTA0YWY2YTU3MDEyMTk3OCJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjYwOWM0NWNiNWEwMGRjYmJmYWRlNDdkZDVjNzliMGVkNzNjZjQyNzE1NTkxYjk2ZGM3ZjFjYjZiY2Y5MGU1NzUifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVRQ0lCbXpUSVZDZlphaXhtTFdpc3hLSzNjeWl2N3ArM1FTQ0pYNlhIUkZ3dEhzQWlCTCsyS2hITWEyTmZOVVd2dlJFNTVzbW9WVFA1eUZ2aXAvNk4rRGxJSE1xdz09IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYWFrTkRRblYxWjBGM1NVSkJaMGxWUjNNMlV5dG5NRFZaVjBveVpXY3liMHd5VW0xTGVHSnViWGgzZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZSVE5OUkdkM1RucE5lbGRvWTA1TmFsVjNUWHBGTTAxRVozaE9lazE2VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVnFLemhsVVdkRFJHSkZjalppU3pBcmRrbDRWVzkzZWxKUGFtVmFVWEo1VmxvM1Rqa0tlbHBrWlhsWGJUWlZNMjF4TW1OTk1rdzJlbE41TjBWTlptWkliVzFEY1RCT1ppdFVTemRzYzJVelZtTXhVMHhLZUhGUFEwSm5iM2RuWjFsSFRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVkdSMDVuQ2xkVFlVSmhSbVpJZURsUVkyOUNNbmxYZURoVU1GWTBkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRaM2xaYWsxNENrNUhUVFJaZWtacVdtcGpNRnBVV210Wk1rVXdUakpOZWxsVVl6UmFWR3hxV2xSR2FFMTZiR2hPVkd4cVRVUnJNazFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm5lVmxxVFhoT1IwMDBXWHBHYWxwcVl6QmFWRnByV1RKRk1FNHlUWHBaVkdNMFdsUnNhbHBVUm1oTmVteG9UbFJzYWsxRWF6Sk5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlOYlVsNkNrMVVVbXBQUjAxNFdUSlpNMDVIVlRKYVIwNW9Ua1JrYWsweVJUTlBSMVUxV1RKVmVGbFVUVFZaVkZVMVdYcEJOVTVxUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVFJQVkZGNlRtcFpNVTlFWTNaWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhVkZaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamRDU0d0QlpIZENNVUZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1lVMXJlbVJaUVVGQlVVUkJSVmwzVWtGSloxaHRhRVJuYWtwc1NXSm5LemxoT1ROeldrZHpDbk56WVhvMGFtMXlNbWR5VUZFMGQyNHlTMmhwTjJWUlEwbERjMFoxYmxWUlZqZEdiRFpQYUhWRE4yMXBOelJNWmpaa2IwVndNRmxCSzBnMkt5OUlaWGtLVlRocllrMUJiMGREUTNGSFUwMDBPVUpCVFVSQk1tdEJUVWRaUTAxUlEycENORlpST1RORlVFTnpNMk5rWXpCQ2F6SmxOblZHT0ZsRlNUWXZLM1pqYlFwS2J6Qm5UWGMxUTBacFMwZEJhMVJXUkdSQ1ZXaEphR0l2ZDBkeVdrTkJRMDFSUkhoTmIzZDRaWFZ6WTI1WFJFZERPRzQ1YTBsbE9EQldha05rUm5KTkNtVm1RWHBZZDFsM2FYVkRLMUUyWW10WVYwUk5VVU5TTUdOUlJpOW1ORGRrTVVVMFBRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE1LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiN2U3MDEyNmY3MTQxZmU5NjViNTM3ZjI3MTJhNmQ0NDJkOWU3MmYzYTZjMzIwNmM5YmE5ZjQ2YzEwMjUwZWQ2MSJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE1LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJlYTdjZTRkYzg4NTA0MjgxYTM2MzgyNDUwODQ1NWJmYzFlNTRmNWIxNmVhMDhiODZiZmI1MjIxM2U5NjM5NDc4In19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiMmIzMTRjOGMxY2Y3NGU2ZGNhNDdjM2E3OGU5Y2UxYTM5YTU5YzA5NiJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEzLCJmb3Jrc19jb3VudCI6NDEzLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjU0LCJvcGVuX2lzc3Vlc19jb3VudCI6NTQsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0xNlQyMTo1Mzo1OVoiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTg3MzQsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAwOCwic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0xNlQyMTo1MjoxOFoiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAwOCwid2F0Y2hlcnNfY291bnQiOjMwMDgsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzODk0MzY2NTg3IiwiZ2l0aHViX3J1bl9udW1iZXIiOiIxOTciLCJnaXRodWJfc2hhMSI6IjJiMzE0YzhjMWNmNzRlNmRjYTQ3YzNhNzhlOWNlMWEzOWE1OWMwOTYifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM4OTQzNjY1ODctMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6IjJiMzE0YzhjMWNmNzRlNmRjYTQ3YzNhNzhlOWNlMWEzOWE1OWMwOTYifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEQCIBmzTIVCfZaixmLWisxKK3cyiv7p+3QSCJX6XHRFwtHsAiBL+2KhHMa2NfNUWvvRE55smoVTP5yFvip/6N+DlIHMqw=="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a6/multiple.intoto.jsonl b/provenance/3.8.1a6/multiple.intoto.jsonl
new file mode 100644
index 00000000000..4bf0475bfa0
--- /dev/null
+++ b/provenance/3.8.1a6/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZDCCBuugAwIBAgIUDo4XbSSxHeVvZIp0r6WDFBjxQ+swCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzE4MDgwNzQ1WhcNMjUwMzE4MDgxNzQ1WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEw9iqiMDdhf7PTq81JyLYkrcjlWccqan9U3VCdfO6B42NYJTu4E3C+tn3vLyacs30LWTGsBPRX0LVd/u7iGOb1KOCBgowggYGMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUMLXVMEcSton+E41EFPp04wP2uFgwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChlMDAyZDVjM2ExNDVlNzkzZDBjNjRjODkzOGY4YWM0MDg3ODBjYTI2MBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDChlMDAyZDVjM2ExNDVlNzkzZDBjNjRjODkzOGY4YWM0MDg3ODBjYTI2MCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoZTAwMmQ1YzNhMTQ1ZTc5M2QwYzY0Yzg5MzhmOGFjNDA4NzgwY2EyNjAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM5MTgxNzY2NjIvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlahLWZoAAAQDAEYwRAIgYhDsandyGWjRLJ10zeZrs/Xkp9l/ZTL1rV2KJU7UsCUCIG0B/sMltO6SYT3DvuoK50MQ/pnPFQ6hbrhBECgwCvldMAoGCCqGSM49BAMDA2cAMGQCMB7G5GtEW01OBp4Lla/f+K3Ci7rBH7b0Ip8xq9ER9C1elrpQ9iL1suluzHOuRtZ6zgIwY0THcLtTmx2cIpTjKJZlid6XVFJipfK1wCQPissf2Wh9sC9RrtZW8O9YDVgMXoIE"}, "tlogEntries":[{"logIndex":"184000996", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1742285265", "inclusionPromise":{"signedEntryTimestamp":"MEUCIQC7xQEm58oaSKBJKi+SLZiXVHyonmwvW2tZxN6izUFMFgIgKy7R0JcrqjYa35PnBpwMVzGBhsBR718BdSqqzL4+InA="}, "inclusionProof":{"logIndex":"62096734", "rootHash":"bvIQICtBlPEhxdOmSTT2dfQ5sg3UC5P+BGzihB2zKhE=", "treeSize":"62096736", "hashes":["4ktqRJIYq6drB7JvXsFTzkpwnxotiNl3AUs4hmpU6h0=", "cjN3kp5UGZNI9Qit/Q8hrEZbX1s13N0tNicczAQSEFk=", "Q8c1b3YX+3N47Y7nqlcwCwX0haS3eTDarqXlDitDNqI=", "F4tuA9O9JP4HruUaNZp8s1E0IvB4DsOCeba5KjkNkL8=", "4Z2O3UzcvdbfMY4CF+Hrovcb4WDge/P2rMcYqRzO80Y=", "TUA1XdbCDlYT6BNGen2o0Sz6tVNvsXsIomhKQ5ZFF+c=", "9pytdFt7LcJGno+d/osTzYtVa6WQDPE1T01XKUf+6WU=", "/sjACvx70jTvzNMg5AkD8cMgKp9hwwgmmPmdS67BjME=", "+bt96OmmMvVtRpIHwrhvhGZl+0aDeOXDpJYtil1qg5U=", "cF0rkox6FS5lQfixIrlvitZ1VEJmtJ93/QbLt8B/CiM=", "IVKvqgEzICH5fAdz/XuCLT8mPP4JvTIJCcfTbV5PC/U=", "yQ8YwJFQlOghyvqbufDtHqdlpHrdDObuLNvjbkrqnTQ=", "DhCOFlWg7sjJF60bWB++3gPNiG9b5vpfnp8Fl4uZ8gk=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n62096736\nbvIQICtBlPEhxdOmSTT2dfQ5sg3UC5P+BGzihB2zKhE=\n\n— rekor.sigstore.dev wNI9ajBEAiANPteNgBGcj+aQ2AClKDdxjKtpcj+WnbcLISCPFISDQwIgeEnGCmFi+QAOIy4PpQavqKIpxQWOjjmcBbj1GGAkdsw=\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiOGFiNTZlYWU2ZmVjOTE1MTFlYTFmMjljN2Q5YzU0NTBmN2VkYjRkOGFjY2MxNGE0ZTE2MjVhNmE0MzlmODRkZiJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjRkYzA4YTM5NWYzOTVhODc5OTI3OGRjYTg3ZDQ0NjNhZWVjN2UwYjJjNGYxYzdjZGI2ZjlmM2JkNGJkNzhhMjAifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lCRzYxRWNQTVNjOXZ4a1JuWERNSGhzeTNJSXlLaEx3OHgrUjZQOEt2TlpLQWlFQW45c2xscGYzSE12amVhNzlYQUZYdERFUXFKZmoyVUh0NzFMVTBnKzdVYWs9IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYVJFTkRRblYxWjBGM1NVSkJaMGxWUkc4MFdHSlRVM2hJWlZaMldrbHdNSEkyVjBSR1FtcDRVU3R6ZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZSVFJOUkdkM1RucFJNVmRvWTA1TmFsVjNUWHBGTkUxRVozaE9lbEV4VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVjNPV2x4YVUxRVpHaG1OMUJVY1RneFNubE1XV3R5WTJwc1YyTmpjV0Z1T1ZVelZrTUtaR1pQTmtJME1rNVpTbFIxTkVVelF5dDBiak4yVEhsaFkzTXpNRXhYVkVkelFsQlNXREJNVm1RdmRUZHBSMDlpTVV0UFEwSm5iM2RuWjFsSFRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVk5URmhXQ2sxRlkxTjBiMjRyUlRReFJVWlFjREEwZDFBeWRVWm5kMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRhR3hOUkVGNUNscEVWbXBOTWtWNFRrUldiRTU2YTNwYVJFSnFUbXBTYWs5RWEzcFBSMWswV1ZkTk1FMUVaek5QUkVKcVdWUkpNazFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm9iRTFFUVhsYVJGWnFUVEpGZUU1RVZteE9lbXQ2V2tSQ2FrNXFVbXBQUkd0NlQwZFpORmxYVFRCTlJHY3pUMFJDYWxsVVNUSk5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlhVkVGM0NrMXRVVEZaZWs1b1RWUlJNVnBVWXpWTk1sRjNXWHBaTUZsNlp6Vk5lbWh0VDBkR2FrNUVRVFJPZW1kM1dUSkZlVTVxUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVFZOVkdkNFRucFpNazVxU1haWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhVkZaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamRDU0d0QlpIZENNVUZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1lXaE1WMXB2UVVGQlVVUkJSVmwzVWtGSloxbG9SSE5oYm1SNVIxZHFVa3hLTVRCNlpWcHlDbk12V0d0d09Xd3ZXbFJNTVhKV01rdEtWVGRWYzBOVlEwbEhNRUl2YzAxc2RFODJVMWxVTTBSMmRXOUxOVEJOVVM5d2JsQkdVVFpvWW5Kb1FrVkRaM2NLUTNac1pFMUJiMGREUTNGSFUwMDBPVUpCVFVSQk1tTkJUVWRSUTAxQ04wYzFSM1JGVnpBeFQwSndORXhzWVM5bUswc3pRMmszY2tKSU4ySXdTWEE0ZUFweE9VVlNPVU14Wld4eWNGRTVhVXd4YzNWc2RYcElUM1ZTZEZvMmVtZEpkMWt3VkVoalRIUlViWGd5WTBsd1ZHcExTbHBzYVdRMldGWkdTbWx3WmtzeENuZERVVkJwYzNObU1sZG9PWE5ET1ZKeWRGcFhPRTg1V1VSV1owMVliMGxGQ2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLIn1dfX0="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE2LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiM2Y3Mjk0MzgxZDQ5OTI1MmNmMDU5MDczMTkyZjEyNzU1MTllNjM0MmM1NGYzNmI1NWRlZDlmZGNkOTgzZjIxNiJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE2LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiIzMjZhNWQyZDBiZmFkZTk0MjQyMzUxNDRlN2M0ZWM3ZTUzNDRiN2Y5NmU4ZDg0OTg2MzIyODBiY2MzNmJkOGVkIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiZTAwMmQ1YzNhMTQ1ZTc5M2QwYzY0Yzg5MzhmOGFjNDA4NzgwY2EyNiJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEzLCJmb3Jrc19jb3VudCI6NDEzLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjYxLCJvcGVuX2lzc3Vlc19jb3VudCI6NjEsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0xN1QyMToxODo0OFoiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTk0OTIsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAwOCwic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0xN1QxNjowNDo0N1oiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAwOCwid2F0Y2hlcnNfY291bnQiOjMwMDgsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzOTE4MTc2NjYyIiwiZ2l0aHViX3J1bl9udW1iZXIiOiIxOTgiLCJnaXRodWJfc2hhMSI6ImUwMDJkNWMzYTE0NWU3OTNkMGM2NGM4OTM4ZjhhYzQwODc4MGNhMjYifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM5MTgxNzY2NjItMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6ImUwMDJkNWMzYTE0NWU3OTNkMGM2NGM4OTM4ZjhhYzQwODc4MGNhMjYifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEUCIBG61EcPMSc9vxkRnXDMHhsy3IIyKhLw8x+R6P8KvNZKAiEAn9sllpf3HMvjea79XAFXtDEQqJfj2UHt71LU0g+7Uak="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a7/multiple.intoto.jsonl b/provenance/3.8.1a7/multiple.intoto.jsonl
new file mode 100644
index 00000000000..f9ebffb9ecd
--- /dev/null
+++ b/provenance/3.8.1a7/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZjCCBuygAwIBAgIUPvjgiG1hdD9Cxj2AV69GmzQ0tXwwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzE5MDgwODIyWhcNMjUwMzE5MDgxODIyWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEay0IDN1lqP9VQhaMwbtfGv5c60prKps2JSPyTTNhNUUfdk1rbgfPqA2P95pWxmvw04iwkWthtasnmu+uI4OB4aOCBgswggYHMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU2yXGIYGAW4Rt9DdyGd4nCmBKxlIwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCg5MjQ1OGI3ODI2ZjUxMWNhMWQwMzM4NWM0NjE4MzhhNjA0NTkzODgyMBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDCg5MjQ1OGI3ODI2ZjUxMWNhMWQwMzM4NWM0NjE4MzhhNjA0NTkzODgyMCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoOTI0NThiNzgyNmY1MTFjYTFkMDMzODVjNDYxODM4YTYwNDU5Mzg4MjAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM5NDE1OTc3ODEvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABla1yRaUAAAQDAEcwRQIhAPnz6JzmTtDpbvJvWz/bUTkkDnWI/ClB6GNtcxgBK/FjAiAYB80Mirg7OASK65wDMt0M6BI20PS3lCqcDesUmKPCGzAKBggqhkjOPQQDAwNoADBlAjA2CVC7M9oi3+shKG06BHSOtFNvecEviBcPEU/VGXkjcMTAdqoWup85X2SUJsyv+1YCMQDVG6kWyz8ljAlgE0h0dulDp6Ot/xpfksuitN/XTSFvffv+QsKWFfOyGgsqOYvTLa8="}, "tlogEntries":[{"logIndex":"184731449", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1742371702", "inclusionPromise":{"signedEntryTimestamp":"MEQCIFPTNPSBcms8IgPtSgejAaOjKE5wvP5TVKTlgRVizi8eAiALTVmgTBepCVSiFWgE9dRg3uXzBKfCHTWPxZTaRj3kuQ=="}, "inclusionProof":{"logIndex":"62827187", "rootHash":"xMDa/GhCZre1muvj5zBmMs0CqBhFgprfh/gO5RjRFB8=", "treeSize":"62827193", "hashes":["ZAoBTA7XD66kf7QaFkmZVW/oluLbrYKHyHID6RklGbM=", "k+8y8CNNJayNSgZMI738ApQvej01J+jMlo954dNwaKY=", "/kFwm2ss6k8cesVovU2r0y+/ZTuAlZ+1nEGcqVB2d7I=", "Wv0EeGDu/COItFKOEChz8f0mFpflf4rtJTu3SX8iQO0=", "b1UQGrEToF4wmcLYkgrEtk9eaQhqP/6Bw8DAYSuRA5Q=", "l2RqvM0N4/odlwoFGj6+6Bsf1FMPe6Yy4iZ/Cfh5Kf0=", "LvwMpTaXeXfK4pRNwSbIm6MyJP9LpLT8sZ/H9ok1LAw=", "gqOKyGLrVjPoJ3KO0JssyrQIlKZb4r1vgTEAiARlcx0=", "IREYUP/HqkOcJKrd/2B9qt/rdb0GJKI4BVF5E4HeL6E=", "RC7fy/dIwjbT8DVb/y7Z548iftaLE8EILLkdmuVSabs=", "yF7ejwPxa869tzb+zzRr5agqo2rgG7JGMfmargLdiZE=", "P9/fswSD5vY42sAytgH/Ahz1hroWTtT7hBhpET5bfJk=", "qj9DW4vYkq6lUZ7eJCGx1BE8E9EEgyLT+tV32wd7f/A=", "Bx7ueMAfmDL2FbDUaQefAIyYvE2hW0XJhK7A6M9lVK4=", "yQ8YwJFQlOghyvqbufDtHqdlpHrdDObuLNvjbkrqnTQ=", "DhCOFlWg7sjJF60bWB++3gPNiG9b5vpfnp8Fl4uZ8gk=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n62827193\nxMDa/GhCZre1muvj5zBmMs0CqBhFgprfh/gO5RjRFB8=\n\n— rekor.sigstore.dev wNI9ajBEAiAzz2jKNzpm13JlcQIHbR1UQRDAx4HDiiaUXSld/WfohgIgaRoLzm+NhbtJiC1dOICiR9ZkMnwct83pZyOz0CCboKU=\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiMWM1NGIzZTg3Zjk4OTc3ZDJhNWY1ZDU2NGIyNjRjZGUyYTYyY2I2MDQ0NjhmOTE5MzI5ZmI5YjgyNzA0YmY5ZiJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6ImU5NGFjMGNhZDBmZjQ0NjhjZTY2ZmJiZjc2NjY1NDc1ZjFiYjE2NjVkNDM4NmMwZmYzZDQyMjQ1OWM0MmU0ODcifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVRQ0lId2tXTXNQb1Y1RnlLOFVjUDByV0pDT2lOTjJ5VG0wWHdMVjBqNHI0Z3BKQWlBeWwyUkQ4eVc2ZWY3Y3V6RWFmQXZXbzZQTS8zaldPV3J4bzZBODhuZmpvdz09IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYWFrTkRRblY1WjBGM1NVSkJaMGxWVUhacVoybEhNV2hrUkRsRGVHb3lRVlkyT1VkdGVsRXdkRmgzZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZSVFZOUkdkM1QwUkplVmRvWTA1TmFsVjNUWHBGTlUxRVozaFBSRWw1VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVmhlVEJKUkU0eGJIRlFPVlpSYUdGTmQySjBaa2QyTldNMk1IQnlTM0J6TWtwVFVIa0tWRlJPYUU1VlZXWmthekZ5WW1kbVVIRkJNbEE1TlhCWGVHMTJkekEwYVhkclYzUm9kR0Z6Ym0xMUszVkpORTlDTkdGUFEwSm5jM2RuWjFsSVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVXllVmhIQ2tsWlIwRlhORkowT1VSa2VVZGtORzVEYlVKTGVHeEpkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRaelZOYWxFeENrOUhTVE5QUkVreVdtcFZlRTFYVG1oTlYxRjNUWHBOTkU1WFRUQk9ha1UwVFhwb2FFNXFRVEJPVkd0NlQwUm5lVTFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm5OVTFxVVRGUFIwa3pUMFJKTWxwcVZYaE5WMDVvVFZkUmQwMTZUVFJPVjAwd1RtcEZORTE2YUdoT2FrRXdUbFJyZWs5RVozbE5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlQVkVrd0NrNVVhR2xPZW1kNVRtMVpNVTFVUm1wWlZFWnJUVVJOZWs5RVZtcE9SRmw0VDBSTk5GbFVXWGRPUkZVMVRYcG5ORTFxUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVFZPUkVVeFQxUmpNMDlFUlhaWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhV2RaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamhDU0c5QlpVRkNNa0ZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1lURjVVbUZWUVVGQlVVUkJSV04zVWxGSmFFRlFibm8yU25wdFZIUkVjR0oyU25aWGVpOWlDbFZVYTJ0RWJsZEpMME5zUWpaSFRuUmplR2RDU3k5R2FrRnBRVmxDT0RCTmFYSm5OMDlCVTBzMk5YZEVUWFF3VFRaQ1NUSXdVRk16YkVOeFkwUmxjMVVLYlV0UVEwZDZRVXRDWjJkeGFHdHFUMUJSVVVSQmQwNXZRVVJDYkVGcVFUSkRWa00zVFRsdmFUTXJjMmhMUnpBMlFraFRUM1JHVG5abFkwVjJhVUpqVUFwRlZTOVdSMWhyYW1OTlZFRmtjVzlYZFhBNE5WZ3lVMVZLYzNsMkt6RlpRMDFSUkZaSE5tdFhlWG80YkdwQmJHZEZNR2d3WkhWc1JIQTJUM1F2ZUhCbUNtdHpkV2wwVGk5WVZGTkdkbVptZGl0UmMwdFhSbVpQZVVkbmMzRlBXWFpVVEdFNFBRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE3LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiYTE1MmI5Mzg3NmZmZjBiMTU0MTRlNjk1MWU5OGZlZDFjYTUwNmQ2ZWFiZDVlYzUxYmRlYTFiZmMyMjQ1ZjU2ZiJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE3LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI2MzQxYWM0NWM3NzE1NTdjZTZlNWU4YmIzN2QwYjFkZWQ2ZWI4ZWNmN2VmYWEyODZhYmIyMzY3Yjg4MjIyZGMyIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiOTI0NThiNzgyNmY1MTFjYTFkMDMzODVjNDYxODM4YTYwNDU5Mzg4MiJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEyLCJmb3Jrc19jb3VudCI6NDEyLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjQ5LCJvcGVuX2lzc3Vlc19jb3VudCI6NDksIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0xOFQyMjoyMjowMloiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTk4NDAsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAwOSwic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0xOFQyMjoyMjowNloiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAwOSwid2F0Y2hlcnNfY291bnQiOjMwMDksIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzOTQxNTk3NzgxIiwiZ2l0aHViX3J1bl9udW1iZXIiOiIxOTkiLCJnaXRodWJfc2hhMSI6IjkyNDU4Yjc4MjZmNTExY2ExZDAzMzg1YzQ2MTgzOGE2MDQ1OTM4ODIifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM5NDE1OTc3ODEtMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6IjkyNDU4Yjc4MjZmNTExY2ExZDAzMzg1YzQ2MTgzOGE2MDQ1OTM4ODIifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEQCIHwkWMsPoV5FyK8UcP0rWJCOiNN2yTm0XwLV0j4r4gpJAiAyl2RD8yW6ef7cuzEafAvWo6PM/3jWOWrxo6A88nfjow=="}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a8/multiple.intoto.jsonl b/provenance/3.8.1a8/multiple.intoto.jsonl
new file mode 100644
index 00000000000..4687426abaa
--- /dev/null
+++ b/provenance/3.8.1a8/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZzCCBuygAwIBAgIUPSKq6ZLjePRpU8YpGdCv0EAkenYwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzIwMDgwNzQ5WhcNMjUwMzIwMDgxNzQ5WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7DA7i4Lu3NuHJqjoPAdul2UAkZKM51nAd5gFzwwQLWCEAOgPVkKR/WotMzOrCBxLQZ8v7ZILT3BcsDVoOSbRa6OCBgswggYHMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUfZIbnBoSk1GOyQo3YbiGmBCIw6UwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBChmMGE0ODNjOTAzYTZlNzlhMjU5NGNhNzM0YjBiZjEyYjVlNjU4ZTZkMBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDChmMGE0ODNjOTAzYTZlNzlhMjU5NGNhNzM0YjBiZjEyYjVlNjU4ZTZkMCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoZjBhNDgzYzkwM2E2ZTc5YTI1OTRjYTczNGIwYmYxMmI1ZTY1OGU2ZDAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM5NjQ1MzE2MDkvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlbKYI2oAAAQDAEcwRQIhAJAWqdi0UmTctxcO1d1fvZsBiX+a/XJXE1VaPM8VkQ/KAiB82feL87cZW7OoJ8rI/ADKe++uhdZWSNtMPvycI47LzjAKBggqhkjOPQQDAwNpADBmAjEA+E5llP1ORbAoQgfMT8n6PltZZ2bwgDVPWEOubhWLYV5gLyV6rTPD+HgIE0FmyOPrAjEAyCXFArDcifBfnI5IetlV6XhgRZUHk9lKwhBl99FxHRQGhzTvD3ZNTOTknl3lvuK7"}, "tlogEntries":[{"logIndex":"185404878", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1742458070", "inclusionPromise":{"signedEntryTimestamp":"MEUCIFZhLv61Y1z3JY037uhOBCh9FK49FUHACD6M+iUBHOyvAiEAq6+44jp7ubxiFaapxopuXbwBq7Vda0Blz/CbzRf2L6o="}, "inclusionProof":{"logIndex":"63500616", "rootHash":"+awByW0oOtfiAmaYOQM0L6zAwzOIYMV1Fj/XjY707UM=", "treeSize":"63500621", "hashes":["T+bKaWpK2omu4/2jMBO6SuadK89l9zgqbFeUMxcxR0E=", "4DBcVUu19OGXfnKqrvkJyuDIGxyBmqaJAASVdHlp1DQ=", "XUKOn/eC2CvLVV6d6G7lvHpYR3CVS8CmaapiSPOwdRg=", "grL5TRt8tmnpbDPRcvDgTF3jtA3dkHGUYKvp8M6lQ9k=", "wFpDyZvSldof8CD5vwzcUfdLD1MqBya83Q1rFkJbcCQ=", "mwLzaQn6Xnz1sg3b3plieT0NvScKGs8mDjbcZCdEWSg=", "qqoDfK4dTGwC+g89Wf4WX1ahQo2bbXPCjH9s87JpKZ8=", "QIH+Ps9AHeaekCnX0xvD4nlQa3CsyYON3d3QaMuZ5us=", "2h2gRTV5iyaY6OfbAxBkLkvRbEbC3gZGsr4pDMxJYeE=", "+NzCu3vxKWWb7TkWKE71JY2xEDjJASTzQWDhTn/OtpY=", "nipdn/m4U0KqSrdksxjBxQXaO6+xh41uBiIO+bQKS5Q=", "V5yK+DEZNmo/DOSKeBtbSMqCabXFwYk8wUVOY2xbE5M=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n63500621\n+awByW0oOtfiAmaYOQM0L6zAwzOIYMV1Fj/XjY707UM=\n\n— rekor.sigstore.dev wNI9ajBFAiAHD8xlxvCtLRDorNi0m4pXSZDr2G2wir66iebTPun1YwIhAMMOguQwTBXR2uQfql05o4fLXdBg+iN67wVhccOFfeaR\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiMmIzY2MxNTczYzRmNDNlYWJkYjgxY2VkZWQ2MzE2NjlhNDIzYzNhY2IwOGI3YjE3MjNlODljNjRmNDQyM2M5MyJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6ImQ3MjAwNmU5YmI0NTViOTcwOWVmN2M5ZTEzMzI5MGFiYzEzNzUzODhiOGUwZmY0Y2M5YzNjMDE4ZGIwNjg1NGEifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVZQ0lRQy8yVCtiRzZvWVE1ZjhvSHRVV1JMenJDdkxtZVYvei81NEtLdW42MGZqT2dJaEFKUGJVbm0vWGpBeG4vRHpOb1VnQmd0cTc0Z2Q5Vkx6dUNsMUFEeFRUOGpMIiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYWVrTkRRblY1WjBGM1NVSkJaMGxWVUZOTGNUWmFUR3BsVUZKd1ZUaFpjRWRrUTNZd1JVRnJaVzVaZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZTWGROUkdkM1RucFJOVmRvWTA1TmFsVjNUWHBKZDAxRVozaE9lbEUxVjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVTNSRUUzYVRSTWRUTk9kVWhLY1dwdlVFRmtkV3d5VlVGcldrdE5OVEZ1UVdRMVowWUtlbmQzVVV4WFEwVkJUMmRRVm10TFVpOVhiM1JOZWs5eVEwSjRURkZhT0hZM1drbE1WRE5DWTNORVZtOVBVMkpTWVRaUFEwSm5jM2RuWjFsSVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVm1Xa2xpQ201Q2IxTnJNVWRQZVZGdk0xbGlhVWR0UWtOSmR6WlZkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRhRzFOUjBVd0NrOUVUbXBQVkVGNldWUmFiRTU2YkdoTmFsVTFUa2RPYUU1NlRUQlpha0pwV21wRmVWbHFWbXhPYWxVMFdsUmFhMDFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm9iVTFIUlRCUFJFNXFUMVJCZWxsVVdteE9lbXhvVFdwVk5VNUhUbWhPZWswd1dXcENhVnBxUlhsWmFsWnNUbXBWTkZwVVdtdE5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlhYWtKb0NrNUVaM3BaZW10M1RUSkZNbHBVWXpWWlZFa3hUMVJTYWxsVVkzcE9SMGwzV1cxWmVFMXRTVEZhVkZreFQwZFZNbHBFUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVFZPYWxFeFRYcEZNazFFYTNaWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhV2RaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamhDU0c5QlpVRkNNa0ZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1lrdFpTVEp2UVVGQlVVUkJSV04zVWxGSmFFRktRVmR4Wkdrd1ZXMVVZM1I0WTA4eFpERm1DblphYzBKcFdDdGhMMWhLV0VVeFZtRlFUVGhXYTFFdlMwRnBRamd5Wm1WTU9EZGpXbGMzVDI5S09ISkpMMEZFUzJVckszVm9aRnBYVTA1MFRWQjJlV01LU1RRM1RIcHFRVXRDWjJkeGFHdHFUMUJSVVVSQmQwNXdRVVJDYlVGcVJVRXJSVFZzYkZBeFQxSmlRVzlSWjJaTlZEaHVObEJzZEZwYU1tSjNaMFJXVUFwWFJVOTFZbWhYVEZsV05XZE1lVlkyY2xSUVJDdElaMGxGTUVadGVVOVFja0ZxUlVGNVExaEdRWEpFWTJsbVFtWnVTVFZKWlhSc1ZqWllhR2RTV2xWSUNtczViRXQzYUVKc09UbEdlRWhTVVVkb2VsUjJSRE5hVGxSUFZHdHViRE5zZG5WTE53b3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE4LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiMWM4YWMwMzU2ZjMyOGM0YzkxMGY1MGRiMWFkYTc3OGYxOWY3MTdiOTE3MjQxM2EzNmIyNWRhMTFlZjYxMGExNSJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE4LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiJlZmFlY2M1NWNiYmZiZThiNTE5YjhkMjAzMzZjZGRhYmRiYTAwMjA0ZTliZTA1OTFmNTU1ZDQ4NWFjNzJlYmNkIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiZjBhNDgzYzkwM2E2ZTc5YTI1OTRjYTczNGIwYmYxMmI1ZTY1OGU2ZCJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEyLCJmb3Jrc19jb3VudCI6NDEyLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjU1LCJvcGVuX2lzc3Vlc19jb3VudCI6NTUsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0xOVQyMTowMjozMFoiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6MTAwNDMxLCJzc2hfdXJsIjoiZ2l0QGdpdGh1Yi5jb206YXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uLmdpdCIsInN0YXJnYXplcnNfY291bnQiOjMwMTAsInN0YXJnYXplcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhcmdhemVycyIsInN0YXR1c2VzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3N0YXR1c2VzL3tzaGF9Iiwic3Vic2NyaWJlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaWJlcnMiLCJzdWJzY3JpcHRpb25fdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3Vic2NyaXB0aW9uIiwic3ZuX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ0YWdzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RhZ3MiLCJ0ZWFtc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi90ZWFtcyIsInRvcGljcyI6WyJhd3MiLCJhd3MtbGFtYmRhIiwiaGFja3RvYmVyZmVzdCIsImxhbWJkYSIsInB5dGhvbiIsInNlcnZlcmxlc3MiXSwidHJlZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3RyZWVzey9zaGF9IiwidXBkYXRlZF9hdCI6IjIwMjUtMDMtMTlUMTI6MDk6MTVaIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJ2aXNpYmlsaXR5IjoicHVibGljIiwid2F0Y2hlcnMiOjMwMTAsIndhdGNoZXJzX2NvdW50IjozMDEwLCJ3ZWJfY29tbWl0X3NpZ25vZmZfcmVxdWlyZWQiOnRydWV9LCJzY2hlZHVsZSI6IjAgOCAqICogMS01Iiwid29ya2Zsb3ciOiIuZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWwifSwiZ2l0aHViX2hlYWRfcmVmIjoiIiwiZ2l0aHViX3JlZiI6InJlZnMvaGVhZHMvZGV2ZWxvcCIsImdpdGh1Yl9yZWZfdHlwZSI6ImJyYW5jaCIsImdpdGh1Yl9yZXBvc2l0b3J5X2lkIjoiMjIxOTE5Mzc5IiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXIiOiJhd3MtcG93ZXJ0b29scyIsImdpdGh1Yl9yZXBvc2l0b3J5X293bmVyX2lkIjoiMTI5MTI3NjM4IiwiZ2l0aHViX3J1bl9hdHRlbXB0IjoiMSIsImdpdGh1Yl9ydW5faWQiOiIxMzk2NDUzMTYwOSIsImdpdGh1Yl9ydW5fbnVtYmVyIjoiMjAwIiwiZ2l0aHViX3NoYTEiOiJmMGE0ODNjOTAzYTZlNzlhMjU5NGNhNzM0YjBiZjEyYjVlNjU4ZTZkIn19LCJtZXRhZGF0YSI6eyJidWlsZEludm9jYXRpb25JRCI6IjEzOTY0NTMxNjA5LTEiLCJjb21wbGV0ZW5lc3MiOnsicGFyYW1ldGVycyI6dHJ1ZSwiZW52aXJvbm1lbnQiOmZhbHNlLCJtYXRlcmlhbHMiOmZhbHNlfSwicmVwcm9kdWNpYmxlIjpmYWxzZX0sIm1hdGVyaWFscyI6W3sidXJpIjoiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob25AcmVmcy9oZWFkcy9kZXZlbG9wIiwiZGlnZXN0Ijp7InNoYTEiOiJmMGE0ODNjOTAzYTZlNzlhMjU5NGNhNzM0YjBiZjEyYjVlNjU4ZTZkIn19XX19", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEYCIQC/2T+bG6oYQ5f8oHtUWRLzrCvLmeV/z/54KKun60fjOgIhAJPbUnm/XjAxn/DzNoUgBgtq74gd9VLzuCl1ADxTT8jL"}]}}
\ No newline at end of file
diff --git a/provenance/3.8.1a9/multiple.intoto.jsonl b/provenance/3.8.1a9/multiple.intoto.jsonl
new file mode 100644
index 00000000000..7f36a55bc10
--- /dev/null
+++ b/provenance/3.8.1a9/multiple.intoto.jsonl
@@ -0,0 +1 @@
+{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial":{"certificate":{"rawBytes":"MIIHZjCCBuygAwIBAgIUZPMMmZWukr9WeVeZD1sNtfSISbwwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMzIxMDgwNzUxWhcNMjUwMzIxMDgxNzUxWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1RBmLQ7hWwEQTb1rRXcUKlhhPRIDuRVhuwL1H0XopkgL16HrZXgE9H39Ah5m07enmUDEowwIksJtKIhdBq9mC6OCBgswggYHMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU4Nmp3/ZgqykFfwKG086QYL0V3fIwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wgYQGA1UdEQEB/wR6MHiGdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOQYKKwYBBAGDvzABAQQraHR0cHM6Ly90b2tlbi5hY3Rpb25zLmdpdGh1YnVzZXJjb250ZW50LmNvbTAWBgorBgEEAYO/MAECBAhzY2hlZHVsZTA2BgorBgEEAYO/MAEDBCg5YzQ1OGU0MjU2ZmMwOGQxOTMwYmExZDdmZTljYjgwMWYxMThhMmYyMBkGCisGAQQBg78wAQQEC1ByZS1SZWxlYXNlMDUGCisGAQQBg78wAQUEJ2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbjAgBgorBgEEAYO/MAEGBBJyZWZzL2hlYWRzL2RldmVsb3AwOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMIGGBgorBgEEAYO/MAEJBHgMdmh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdG9yX2dlbmVyaWNfc2xzYTMueW1sQHJlZnMvdGFncy92Mi4xLjAwOAYKKwYBBAGDvzABCgQqDChmN2RkOGM1NGMyMDY3YmFmYzEyY2E3YTU1NTk1ZDVlZTliNzUyMDRhMB0GCisGAQQBg78wAQsEDwwNZ2l0aHViLWhvc3RlZDBKBgorBgEEAYO/MAEMBDwMOmh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24wOAYKKwYBBAGDvzABDQQqDCg5YzQ1OGU0MjU2ZmMwOGQxOTMwYmExZDdmZTljYjgwMWYxMThhMmYyMCIGCisGAQQBg78wAQ4EFAwScmVmcy9oZWFkcy9kZXZlbG9wMBkGCisGAQQBg78wAQ8ECwwJMjIxOTE5Mzc5MDEGCisGAQQBg78wARAEIwwhaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzMBkGCisGAQQBg78wAREECwwJMTI5MTI3NjM4MH8GCisGAQQBg78wARIEcQxvaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi8uZ2l0aHViL3dvcmtmbG93cy9wcmUtcmVsZWFzZS55bWxAcmVmcy9oZWFkcy9kZXZlbG9wMDgGCisGAQQBg78wARMEKgwoOWM0NThlNDI1NmZjMDhkMTkzMGJhMWQ3ZmU5Y2I4MDFmMTE4YTJmMjAYBgorBgEEAYO/MAEUBAoMCHNjaGVkdWxlMG4GCisGAQQBg78wARUEYAxeaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9hY3Rpb25zL3J1bnMvMTM5ODcyMDY4NjgvYXR0ZW1wdHMvMTAWBgorBgEEAYO/MAEWBAgMBnB1YmxpYzCBigYKKwYBBAHWeQIEAgR8BHoAeAB2AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABlbe+hE8AAAQDAEcwRQIgZT1zQIjUEFhYjSb7N6ejaBe3vRsugb/i9EOycbVCWFACIQD236Aup7WpDFDF3eDImtLHdwN9HCMawv4zMhzoMk9rFDAKBggqhkjOPQQDAwNoADBlAjAg4ENcE5m5i52n8brYHVoH56DspAOjnd+U0moRQ6RQsMScuDsWjaJ1B1x/EVqnmAcCMQC9aT+yzkec/FQDahCdIsjBa7+COuRjkEOD3O/2pGl+zumaGE/zF5fDw0Jb90hW5bU="}, "tlogEntries":[{"logIndex":"185991956", "logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion":{"kind":"dsse", "version":"0.0.1"}, "integratedTime":"1742544471", "inclusionPromise":{"signedEntryTimestamp":"MEYCIQD0kLtkOu27o4Tl7fOZBXcGNAQ5fvP5xIxQMMHQhOwLMAIhANYraeKWMYr0PpKwTi4+8rJDNf/eFnSYwIaZNFxCjhmS"}, "inclusionProof":{"logIndex":"64087694", "rootHash":"HBWM8Fp++0SoASpAvEJ9zyKX299bIlNiMcNEuIHTT7o=", "treeSize":"64087697", "hashes":["hiL/OMV5cTNKcztvDBjJZV881MCWltsC0IyAeYJHrcU=", "b5/WaOS3Q3hh0NyjYLdJfwNaXsG3OONsdvgGiYuWUtg=", "d0rY3Z+noLqMRcDWXyulAmgJPcpB4shCYk8PsyKUFvE=", "SIDDdx9xx3eyzh3Rh3NVoG7Za3Hd03rCp0NhfE3aTHo=", "souXajKndCRuVNJ7/UCYQ8gT9xoP4jTw5u1YzgGcZbI=", "bU4WK3x4F3fibA39WWOey2lhBmcN323nBO8547Jywf4=", "a/jia6/ZBzUrxFitDvkqxjL2tobJyWlHLQ89racN4iw=", "GkddKMKzMFpgQ8DkId1yy+VItFoodM07G0IfkWD3YSQ=", "W6fY8LSD2OnkmwgpL+Wfr6awf44YBwbfVEnxesVWFao=", "8PPeELgs3AlFODYR1pNAGlAXf+c2UeXQYfVOB+xLAzc=", "2y6U+mdQWF05N6S/4jGJ/jSTyZDQOpAk0+wjLjrhbPM=", "1Tpd2VAcDaqNdIpBj4bI2Vj1XPiMoS7NHroCFl+9iDM=", "J+5S6L7HRyf5anwQZxJQVjeGksz+qCkwXB/YkOpv8I0=", "V5yK+DEZNmo/DOSKeBtbSMqCabXFwYk8wUVOY2xbE5M=", "Ti0aqM4Q394q4eJd4fPIPwQx83W504b3jxFdwVdDaUw=", "ebCKJ53lKWPqIx8mXXgznF9DGoQv70J7JTlFAav6s5E=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n64087697\nHBWM8Fp++0SoASpAvEJ9zyKX299bIlNiMcNEuIHTT7o=\n\n— rekor.sigstore.dev wNI9ajBFAiBzzB8PgAf3SbqyjMyD3Y0so8AKfLcpRLLTNpD6Tpc7pgIhAMpXMx9yo0n6PzfbROX3kAaqASgHDb0m/Pv3gq2d0pw2\n"}}, "canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiM2UwZTg1N2Y4ZjExOTQ5ZjM4NDVmMjNiMGIzYWM2YmM5MTY4MDBjODNhMTQwZjZlZDg0ZGM3Nzc4Y2Q2MmZkZCJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjdjZmZiYWNhMTJjM2JkYjEyZTcxZGExOTNlZWEyMGQyZDA1N2M3OTBlMWQ4YTAwNTJkMTlmYzA0NjI3ZGI1N2YifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVZQ0lRQ21RT0oxNUh5NjNvRzFmY2VOSnN2MmRkMzcyMXU5NlNHeUxxK3F1TDhJa3dJaEFPYnlvb2crbWpwb2REVHpaTUFEcmVZc0FHano4V0p0Z1o1QkhTWHFXSEJZIiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VoYWFrTkRRblY1WjBGM1NVSkJaMGxWV2xCTlRXMWFWM1ZyY2psWFpWWmxXa1F4YzA1MFpsTkpVMkozZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwVmQwMTZTWGhOUkdkM1RucFZlRmRvWTA1TmFsVjNUWHBKZUUxRVozaE9lbFY0VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVXhVa0p0VEZFM2FGZDNSVkZVWWpGeVVsaGpWVXRzYUdoUVVrbEVkVkpXYUhWM1RERUtTREJZYjNCclowd3hOa2h5V2xoblJUbElNemxCYURWdE1EZGxibTFWUkVWdmQzZEphM05LZEV0SmFHUkNjVGx0UXpaUFEwSm5jM2RuWjFsSVRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVTBUbTF3Q2pNdldtZHhlV3RHWm5kTFJ6QTRObEZaVERCV00yWkpkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMmRaVVVkQk1WVmtSVkZGUWk5M1VqWk5TR2xIWkcxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01ZW1KSVRtaE1WMXA1V1ZjeGJBcGtNamw1WVhrNWVtSklUbWhNVjJSd1pFZG9NVmxwTVc1YVZ6VnNZMjFHTUdJelNYWk1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaYU1sWjFDbHBZU21oa1J6bDVXREprYkdKdFZubGhWMDVtWXpKNGVsbFVUWFZsVnpGelVVaEtiRnB1VFhaa1IwWnVZM2s1TWsxcE5IaE1ha0YzVDFGWlMwdDNXVUlLUWtGSFJIWjZRVUpCVVZGeVlVaFNNR05JVFRaTWVUa3dZakowYkdKcE5XaFpNMUp3WWpJMWVreHRaSEJrUjJneFdXNVdlbHBZU21waU1qVXdXbGMxTUFwTWJVNTJZbFJCVjBKbmIzSkNaMFZGUVZsUEwwMUJSVU5DUVdoNldUSm9iRnBJVm5OYVZFRXlRbWR2Y2tKblJVVkJXVTh2VFVGRlJFSkRaelZaZWxFeENrOUhWVEJOYWxVeVdtMU5kMDlIVVhoUFZFMTNXVzFGZUZwRVpHMWFWR3hxV1dwbmQwMVhXWGhOVkdob1RXMVplVTFDYTBkRGFYTkhRVkZSUW1jM09IY0tRVkZSUlVNeFFubGFVekZUV2xkNGJGbFlUbXhOUkZWSFEybHpSMEZSVVVKbk56aDNRVkZWUlVveVJqTmplVEYzWWpOa2JHTnVVblppTW5oNlRETkNkZ3BrTWxaNVpFYzVkbUpJVFhSaVIwWjBXVzFTYUV4WVFqVmtSMmgyWW1wQlowSm5iM0pDWjBWRlFWbFBMMDFCUlVkQ1FrcDVXbGRhZWt3eWFHeFpWMUo2Q2t3eVVteGtiVlp6WWpOQmQwOTNXVXRMZDFsQ1FrRkhSSFo2UVVKRFFWRjBSRU4wYjJSSVVuZGplbTkyVEROU2RtRXlWblZNYlVacVpFZHNkbUp1VFhVS1dqSnNNR0ZJVm1sa1dFNXNZMjFPZG1KdVVteGlibEYxV1RJNWRFMUpSMGRDWjI5eVFtZEZSVUZaVHk5TlFVVktRa2huVFdSdGFEQmtTRUo2VDJrNGRncGFNbXd3WVVoV2FVeHRUblppVXpsNllraE9hRXhYV25sWlZ6RnNaREk1ZVdGNU9YcGlTRTVvVEZka2NHUkhhREZaYVRGdVdsYzFiR050UmpCaU0wbDJDa3h0WkhCa1IyZ3hXV2s1TTJJelNuSmFiWGgyWkROTmRsb3lWblZhV0Vwb1pFYzVlVmd5Wkd4aWJWWjVZVmRPWm1NeWVIcFpWRTExWlZjeGMxRklTbXdLV201TmRtUkhSbTVqZVRreVRXazBlRXhxUVhkUFFWbExTM2RaUWtKQlIwUjJla0ZDUTJkUmNVUkRhRzFPTWxKclQwZE5NVTVIVFhsTlJGa3pXVzFHYlFwWmVrVjVXVEpGTTFsVVZURk9WR3N4V2tSV2JGcFViR2xPZWxWNVRVUlNhRTFDTUVkRGFYTkhRVkZSUW1jM09IZEJVWE5GUkhkM1Rsb3liREJoU0ZacENreFhhSFpqTTFKc1drUkNTMEpuYjNKQ1owVkZRVmxQTDAxQlJVMUNSSGROVDIxb01HUklRbnBQYVRoMldqSnNNR0ZJVm1sTWJVNTJZbE01YUdRelRYUUtZMGM1TTFwWVNqQmlNamx6WTNrNWQySXpaR3hqYmxKMllqSjRla3hYZUdoaVYwcHJXVk14ZDJWWVVtOWlNalIzVDBGWlMwdDNXVUpDUVVkRWRucEJRZ3BFVVZGeFJFTm5OVmw2VVRGUFIxVXdUV3BWTWxwdFRYZFBSMUY0VDFSTmQxbHRSWGhhUkdSdFdsUnNhbGxxWjNkTlYxbDRUVlJvYUUxdFdYbE5RMGxIQ2tOcGMwZEJVVkZDWnpjNGQwRlJORVZHUVhkVFkyMVdiV041T1c5YVYwWnJZM2s1YTFwWVdteGlSemwzVFVKclIwTnBjMGRCVVZGQ1p6YzRkMEZST0VVS1EzZDNTazFxU1hoUFZFVTFUWHBqTlUxRVJVZERhWE5IUVZGUlFtYzNPSGRCVWtGRlNYZDNhR0ZJVWpCalNFMDJUSGs1Ym1GWVVtOWtWMGwxV1RJNWRBcE1Na1l6WTNreGQySXpaR3hqYmxKMllqSjRlazFDYTBkRGFYTkhRVkZSUW1jM09IZEJVa1ZGUTNkM1NrMVVTVFZOVkVrelRtcE5ORTFJT0VkRGFYTkhDa0ZSVVVKbk56aDNRVkpKUldOUmVIWmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1rWXpZM2t4ZDJJelpHeGpibEoyWWpKNGVrd3pRbllLWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9IVmFNbXd3WVVoV2FVd3paSFpqYlhSdFlrYzVNMk41T1hkamJWVjBZMjFXY3dwYVYwWjZXbE0xTldKWGVFRmpiVlp0WTNrNWIxcFhSbXRqZVRscldsaGFiR0pIT1hkTlJHZEhRMmx6UjBGUlVVSm5OemgzUVZKTlJVdG5kMjlQVjAwd0NrNVVhR3hPUkVreFRtMWFhazFFYUd0TlZHdDZUVWRLYUUxWFVUTmFiVlUxV1RKSk5FMUVSbTFOVkVVMFdWUktiVTFxUVZsQ1oyOXlRbWRGUlVGWlR5OEtUVUZGVlVKQmIwMURTRTVxWVVkV2EyUlhlR3hOUnpSSFEybHpSMEZSVVVKbk56aDNRVkpWUlZsQmVHVmhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkUXBaTWpsMFRESkdNMk41TVhkaU0yUnNZMjVTZG1JeWVIcE1NMEoyWkRKV2VXUkhPWFppU0UxMFlrZEdkRmx0VW1oTVdFSTFaRWRvZG1KcE9XaFpNMUp3Q21JeU5YcE1NMG94WW01TmRrMVVUVFZQUkdONVRVUlpORTVxWjNaWldGSXdXbGN4ZDJSSVRYWk5WRUZYUW1kdmNrSm5SVVZCV1U4dlRVRkZWMEpCWjAwS1FtNUNNVmx0ZUhCWmVrTkNhV2RaUzB0M1dVSkNRVWhYWlZGSlJVRm5VamhDU0c5QlpVRkNNa0ZPTURsTlIzSkhlSGhGZVZsNGEyVklTbXh1VG5kTGFRcFRiRFkwTTJwNWRDODBaVXRqYjBGMlMyVTJUMEZCUVVKc1ltVXJhRVU0UVVGQlVVUkJSV04zVWxGSloxcFVNWHBSU1dwVlJVWm9XV3BUWWpkT05tVnFDbUZDWlROMlVuTjFaMkl2YVRsRlQzbGpZbFpEVjBaQlEwbFJSREl6TmtGMWNEZFhjRVJHUkVZelpVUkpiWFJNU0dSM1RqbElRMDFoZDNZMGVrMW9lbThLVFdzNWNrWkVRVXRDWjJkeGFHdHFUMUJSVVVSQmQwNXZRVVJDYkVGcVFXYzBSVTVqUlRWdE5XazFNbTQ0WW5KWlNGWnZTRFUyUkhOd1FVOXFibVFyVlFvd2JXOVNVVFpTVVhOTlUyTjFSSE5YYW1GS01VSXhlQzlGVm5GdWJVRmpRMDFSUXpsaFZDdDVlbXRsWXk5R1VVUmhhRU5rU1hOcVFtRTNLME5QZFZKcUNtdEZUMFF6VHk4eWNFZHNLM3AxYldGSFJTOTZSalZtUkhjd1NtSTVNR2hYTldKVlBRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENnPT0ifV19fQ=="}]}, "dsseEnvelope":{"payload":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjAuMSIsInByZWRpY2F0ZVR5cGUiOiJodHRwczovL3Nsc2EuZGV2L3Byb3ZlbmFuY2UvdjAuMiIsInN1YmplY3QiOlt7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE5LXB5My1ub25lLWFueS53aGwiLCJkaWdlc3QiOnsic2hhMjU2IjoiYzBmYThjNDljOTRhN2ViYmY5ZmY5YmM0NWExZmY5ZWQzYmJlZmM2ZWNjODJmZjg4ODZlMzY2YzJkNmIyNTllNSJ9fSx7Im5hbWUiOiIuL2F3c19sYW1iZGFfcG93ZXJ0b29scy0zLjguMWE5LnRhci5neiIsImRpZ2VzdCI6eyJzaGEyNTYiOiI4ZjUyZmEzNjY2YTM4MzE5Y2YzZmJjYTgzODMyMTcxMzM1Yjc5ODJlNWMzOTZkMzUxY2E4ZDgzYTE4NTdjZTNlIn19XSwicHJlZGljYXRlIjp7ImJ1aWxkZXIiOnsiaWQiOiJodHRwczovL2dpdGh1Yi5jb20vc2xzYS1mcmFtZXdvcmsvc2xzYS1naXRodWItZ2VuZXJhdG9yLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRvcl9nZW5lcmljX3Nsc2EzLnltbEByZWZzL3RhZ3MvdjIuMS4wIn0sImJ1aWxkVHlwZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9zbHNhLWZyYW1ld29yay9zbHNhLWdpdGh1Yi1nZW5lcmF0b3IvZ2VuZXJpY0B2MSIsImludm9jYXRpb24iOnsiY29uZmlnU291cmNlIjp7InVyaSI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uQHJlZnMvaGVhZHMvZGV2ZWxvcCIsImRpZ2VzdCI6eyJzaGExIjoiOWM0NThlNDI1NmZjMDhkMTkzMGJhMWQ3ZmU5Y2I4MDFmMTE4YTJmMiJ9LCJlbnRyeVBvaW50IjoiLmdpdGh1Yi93b3JrZmxvd3MvcHJlLXJlbGVhc2UueW1sIn0sImVudmlyb25tZW50Ijp7ImdpdGh1Yl9hY3RvciI6ImxlYW5kcm9kYW1hc2NlbmEiLCJnaXRodWJfYWN0b3JfaWQiOiI0Mjk1MTczIiwiZ2l0aHViX2Jhc2VfcmVmIjoiIiwiZ2l0aHViX2V2ZW50X25hbWUiOiJzY2hlZHVsZSIsImdpdGh1Yl9ldmVudF9wYXlsb2FkIjp7ImVudGVycHJpc2UiOnsiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vYi8xMjkwP3Y9NCIsImNyZWF0ZWRfYXQiOiIyMDE5LTExLTEzVDE4OjA1OjQxWiIsImRlc2NyaXB0aW9uIjoiIiwiaHRtbF91cmwiOiJodHRwczovL2dpdGh1Yi5jb20vZW50ZXJwcmlzZXMvYW1hem9uIiwiaWQiOjEyOTAsIm5hbWUiOiJBbWF6b24iLCJub2RlX2lkIjoiTURFd09rVnVkR1Z5Y0hKcGMyVXhNamt3Iiwic2x1ZyI6ImFtYXpvbiIsInVwZGF0ZWRfYXQiOiIyMDI0LTA5LTMwVDIxOjAyOjMwWiIsIndlYnNpdGVfdXJsIjoiaHR0cHM6Ly93d3cuYW1hem9uLmNvbS8ifSwib3JnYW5pemF0aW9uIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImRlc2NyaXB0aW9uIjoiIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9ldmVudHMiLCJob29rc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvYXdzLXBvd2VydG9vbHMvaG9va3MiLCJpZCI6MTI5MTI3NjM4LCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzL2F3cy1wb3dlcnRvb2xzL2lzc3VlcyIsImxvZ2luIjoiYXdzLXBvd2VydG9vbHMiLCJtZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9tZW1iZXJzey9tZW1iZXJ9Iiwibm9kZV9pZCI6Ik9fa2dET0I3SlUxZyIsInB1YmxpY19tZW1iZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9wdWJsaWNfbWVtYmVyc3svbWVtYmVyfSIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scy9yZXBvcyIsInVybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy9hd3MtcG93ZXJ0b29scyJ9LCJyZXBvc2l0b3J5Ijp7ImFsbG93X2ZvcmtpbmciOnRydWUsImFyY2hpdmVfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24ve2FyY2hpdmVfZm9ybWF0fXsvcmVmfSIsImFyY2hpdmVkIjpmYWxzZSwiYXNzaWduZWVzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2Fzc2lnbmVlc3svdXNlcn0iLCJibG9ic191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvYmxvYnN7L3NoYX0iLCJicmFuY2hlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9icmFuY2hlc3svYnJhbmNofSIsImNsb25lX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0IiwiY29sbGFib3JhdG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb2xsYWJvcmF0b3Jzey9jb2xsYWJvcmF0b3J9IiwiY29tbWVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29tbWVudHN7L251bWJlcn0iLCJjb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbW1pdHN7L3NoYX0iLCJjb21wYXJlX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9IiwiY29udGVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vY29udGVudHMveytwYXRofSIsImNvbnRyaWJ1dG9yc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9jb250cmlidXRvcnMiLCJjcmVhdGVkX2F0IjoiMjAxOS0xMS0xNVQxMjoyNjoxMloiLCJjdXN0b21fcHJvcGVydGllcyI6e30sImRlZmF1bHRfYnJhbmNoIjoiZGV2ZWxvcCIsImRlcGxveW1lbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2RlcGxveW1lbnRzIiwiZGVzY3JpcHRpb24iOiJBIGRldmVsb3BlciB0b29sa2l0IHRvIGltcGxlbWVudCBTZXJ2ZXJsZXNzIGJlc3QgcHJhY3RpY2VzIGFuZCBpbmNyZWFzZSBkZXZlbG9wZXIgdmVsb2NpdHkuIiwiZGlzYWJsZWQiOmZhbHNlLCJkb3dubG9hZHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZG93bmxvYWRzIiwiZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2V2ZW50cyIsImZvcmsiOmZhbHNlLCJmb3JrcyI6NDEyLCJmb3Jrc19jb3VudCI6NDEyLCJmb3Jrc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9mb3JrcyIsImZ1bGxfbmFtZSI6ImF3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsImdpdF9jb21taXRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2dpdC9jb21taXRzey9zaGF9IiwiZ2l0X3JlZnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vZ2l0L3JlZnN7L3NoYX0iLCJnaXRfdGFnc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdGFnc3svc2hhfSIsImdpdF91cmwiOiJnaXQ6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi5naXQiLCJoYXNfZGlzY3Vzc2lvbnMiOnRydWUsImhhc19kb3dubG9hZHMiOnRydWUsImhhc19pc3N1ZXMiOnRydWUsImhhc19wYWdlcyI6ZmFsc2UsImhhc19wcm9qZWN0cyI6dHJ1ZSwiaGFzX3dpa2kiOmZhbHNlLCJob21lcGFnZSI6Imh0dHBzOi8vZG9jcy5wb3dlcnRvb2xzLmF3cy5kZXYvbGFtYmRhL3B5dGhvbi9sYXRlc3QvIiwiaG9va3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaG9va3MiLCJodG1sX3VybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24iLCJpZCI6MjIxOTE5Mzc5LCJpc190ZW1wbGF0ZSI6ZmFsc2UsImlzc3VlX2NvbW1lbnRfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzL2NvbW1lbnRzey9udW1iZXJ9IiwiaXNzdWVfZXZlbnRzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2lzc3Vlcy9ldmVudHN7L251bWJlcn0iLCJpc3N1ZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vaXNzdWVzey9udW1iZXJ9Iiwia2V5c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9rZXlzey9rZXlfaWR9IiwibGFiZWxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL2xhYmVsc3svbmFtZX0iLCJsYW5ndWFnZSI6IlB5dGhvbiIsImxhbmd1YWdlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9sYW5ndWFnZXMiLCJsaWNlbnNlIjp7ImtleSI6Im1pdC0wIiwibmFtZSI6Ik1JVCBObyBBdHRyaWJ1dGlvbiIsIm5vZGVfaWQiOiJNRGM2VEdsalpXNXpaVFF4Iiwic3BkeF9pZCI6Ik1JVC0wIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9saWNlbnNlcy9taXQtMCJ9LCJtZXJnZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbWVyZ2VzIiwibWlsZXN0b25lc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9taWxlc3RvbmVzey9udW1iZXJ9IiwibWlycm9yX3VybCI6bnVsbCwibmFtZSI6InBvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsIm5vZGVfaWQiOiJNREV3T2xKbGNHOXphWFJ2Y25reU1qRTVNVGt6TnprPSIsIm5vdGlmaWNhdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vbm90aWZpY2F0aW9uc3s/c2luY2UsYWxsLHBhcnRpY2lwYXRpbmd9Iiwib3Blbl9pc3N1ZXMiOjU0LCJvcGVuX2lzc3Vlc19jb3VudCI6NTQsIm93bmVyIjp7ImF2YXRhcl91cmwiOiJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI5MTI3NjM4P3Y9NCIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL2V2ZW50c3svcHJpdmFjeX0iLCJmb2xsb3dlcnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dlcnMiLCJmb2xsb3dpbmdfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9mb2xsb3dpbmd7L290aGVyX3VzZXJ9IiwiZ2lzdHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy9hd3MtcG93ZXJ0b29scy9naXN0c3svZ2lzdF9pZH0iLCJncmF2YXRhcl9pZCI6IiIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzIiwiaWQiOjEyOTEyNzYzOCwibG9naW4iOiJhd3MtcG93ZXJ0b29scyIsIm5vZGVfaWQiOiJPX2tnRE9CN0pVMWciLCJvcmdhbml6YXRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvb3JncyIsInJlY2VpdmVkX2V2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3JlY2VpdmVkX2V2ZW50cyIsInJlcG9zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvcmVwb3MiLCJzaXRlX2FkbWluIjpmYWxzZSwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXdzLXBvd2VydG9vbHMvc3Vic2NyaXB0aW9ucyIsInR5cGUiOiJPcmdhbml6YXRpb24iLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2F3cy1wb3dlcnRvb2xzIiwidXNlcl92aWV3X3R5cGUiOiJwdWJsaWMifSwicHJpdmF0ZSI6ZmFsc2UsInB1bGxzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3B1bGxzey9udW1iZXJ9IiwicHVzaGVkX2F0IjoiMjAyNS0wMy0yMFQyMjo0NDoxNFoiLCJyZWxlYXNlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9yZWxlYXNlc3svaWR9Iiwic2l6ZSI6OTk1MzAsInNzaF91cmwiOiJnaXRAZ2l0aHViLmNvbTphd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24uZ2l0Iiwic3RhcmdhemVyc19jb3VudCI6MzAxMSwic3RhcmdhemVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdGFyZ2F6ZXJzIiwic3RhdHVzZXNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vc3RhdHVzZXMve3NoYX0iLCJzdWJzY3JpYmVyc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpYmVycyIsInN1YnNjcmlwdGlvbl91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9zdWJzY3JpcHRpb24iLCJzdm5fdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInRhZ3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hd3MtcG93ZXJ0b29scy9wb3dlcnRvb2xzLWxhbWJkYS1weXRob24vdGFncyIsInRlYW1zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXdzLXBvd2VydG9vbHMvcG93ZXJ0b29scy1sYW1iZGEtcHl0aG9uL3RlYW1zIiwidG9waWNzIjpbImF3cyIsImF3cy1sYW1iZGEiLCJoYWNrdG9iZXJmZXN0IiwibGFtYmRhIiwicHl0aG9uIiwic2VydmVybGVzcyJdLCJ0cmVlc191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbi9naXQvdHJlZXN7L3NoYX0iLCJ1cGRhdGVkX2F0IjoiMjAyNS0wMy0yMFQyMjo0MTo1OVoiLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbiIsInZpc2liaWxpdHkiOiJwdWJsaWMiLCJ3YXRjaGVycyI6MzAxMSwid2F0Y2hlcnNfY291bnQiOjMwMTEsIndlYl9jb21taXRfc2lnbm9mZl9yZXF1aXJlZCI6dHJ1ZX0sInNjaGVkdWxlIjoiMCA4ICogKiAxLTUiLCJ3b3JrZmxvdyI6Ii5naXRodWIvd29ya2Zsb3dzL3ByZS1yZWxlYXNlLnltbCJ9LCJnaXRodWJfaGVhZF9yZWYiOiIiLCJnaXRodWJfcmVmIjoicmVmcy9oZWFkcy9kZXZlbG9wIiwiZ2l0aHViX3JlZl90eXBlIjoiYnJhbmNoIiwiZ2l0aHViX3JlcG9zaXRvcnlfaWQiOiIyMjE5MTkzNzkiLCJnaXRodWJfcmVwb3NpdG9yeV9vd25lciI6ImF3cy1wb3dlcnRvb2xzIiwiZ2l0aHViX3JlcG9zaXRvcnlfb3duZXJfaWQiOiIxMjkxMjc2MzgiLCJnaXRodWJfcnVuX2F0dGVtcHQiOiIxIiwiZ2l0aHViX3J1bl9pZCI6IjEzOTg3MjA2ODY4IiwiZ2l0aHViX3J1bl9udW1iZXIiOiIyMDEiLCJnaXRodWJfc2hhMSI6IjljNDU4ZTQyNTZmYzA4ZDE5MzBiYTFkN2ZlOWNiODAxZjExOGEyZjIifX0sIm1ldGFkYXRhIjp7ImJ1aWxkSW52b2NhdGlvbklEIjoiMTM5ODcyMDY4NjgtMSIsImNvbXBsZXRlbmVzcyI6eyJwYXJhbWV0ZXJzIjp0cnVlLCJlbnZpcm9ubWVudCI6ZmFsc2UsIm1hdGVyaWFscyI6ZmFsc2V9LCJyZXByb2R1Y2libGUiOmZhbHNlfSwibWF0ZXJpYWxzIjpbeyJ1cmkiOiJnaXQraHR0cHM6Ly9naXRodWIuY29tL2F3cy1wb3dlcnRvb2xzL3Bvd2VydG9vbHMtbGFtYmRhLXB5dGhvbkByZWZzL2hlYWRzL2RldmVsb3AiLCJkaWdlc3QiOnsic2hhMSI6IjljNDU4ZTQyNTZmYzA4ZDE5MzBiYTFkN2ZlOWNiODAxZjExOGEyZjIifX1dfX0=", "payloadType":"application/vnd.in-toto+json", "signatures":[{"sig":"MEYCIQCmQOJ15Hy63oG1fceNJsv2dd3721u96SGyLq+quL8IkwIhAObyoog+mjpodDTzZMADreYsAGjz8WJtgZ5BHSXqWHBY"}]}}
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index ecacc3199c5..ae654ec37a5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "aws_lambda_powertools"
-version = "3.7.1a7"
+version = "3.9.0"
description = "Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity."
authors = ["Amazon Web Services"]
include = ["aws_lambda_powertools/py.typed", "THIRD-PARTY-LICENSES"]
@@ -51,9 +51,9 @@ pydantic = { version = "^2.4.0", optional = true }
pydantic-settings = {version = "^2.6.1", optional = true}
boto3 = { version = "^1.34.32", optional = true }
redis = { version = ">=4.4,<6.0", optional = true }
-datadog-lambda = { version = ">=4.77,<7.0", optional = true }
aws-encryption-sdk = { version = ">=3.1.1,<5.0.0", optional = true }
jsonpath-ng = { version = "^1.6.0", optional = true }
+datadog-lambda = { version = "^6.106.0", optional = true }
[tool.poetry.extras]
@@ -107,13 +107,13 @@ hvac = "^2.3.0"
aws-requests-auth = "^0.4.3"
urllib3 = "<2"
requests = ">=2.32.0"
-cfn-lint = "1.28.0"
+cfn-lint = "1.32.0"
mypy = "^1.1.1"
types-python-dateutil = "^2.8.19.6"
aws-cdk-aws-appsync-alpha = "^2.59.0a0"
httpx = ">=0.23.3,<0.29.0"
sentry-sdk = ">=1.22.2,<3.0.0"
-ruff = ">=0.5.1,<0.9.10"
+ruff = ">=0.5.1,<0.11.3"
retry2 = "^0.9.5"
pytest-socket = ">=0.6,<0.8"
types-redis = "^4.6.0.7"
@@ -123,6 +123,7 @@ boto3-stubs = {extras = ["appconfig", "appconfigdata", "cloudformation", "cloudw
nox = "^2024.4.15"
mkdocstrings-python = "^1.13.0"
licensecheck = "^2024.3"
+datadog-lambda = "^6.106.0"
[tool.coverage.run]
source = ["aws_lambda_powertools"]
diff --git a/ruff.toml b/ruff.toml
index 456b158be21..b415c63f949 100644
--- a/ruff.toml
+++ b/ruff.toml
@@ -38,7 +38,8 @@ lint.ignore = [
"B904", # raise-without-from-inside-except - disabled temporarily
"PLC1901", # Compare-to-empty-string - disabled temporarily
"PYI024",
- "A005"
+ "A005",
+ "TC006" # https://docs.astral.sh/ruff/rules/runtime-cast-value/
]
# Exclude files and directories
diff --git a/tests/functional/event_handler/_pydantic/test_openapi_config.py b/tests/functional/event_handler/_pydantic/test_openapi_config.py
new file mode 100644
index 00000000000..9fc2dd1ce7b
--- /dev/null
+++ b/tests/functional/event_handler/_pydantic/test_openapi_config.py
@@ -0,0 +1,87 @@
+import json
+
+from aws_lambda_powertools.event_handler import APIGatewayRestResolver
+
+
+def test_export_openapi_schema_with_custom_configuration():
+ # GIVEN an API Gateway resolver with OpenAPI validation enabled
+ app = APIGatewayRestResolver(enable_validation=True)
+
+ # GIVEN custom OpenAPI configuration
+ openapi_title = "My API"
+ openapi_myapi_version = "1.1.1-alpha"
+ app.configure_openapi(title=openapi_title, version=openapi_myapi_version)
+
+ # WHEN we have a simple handler
+ @app.get("/")
+ def handler():
+ pass
+
+ # WHEN we get the schema
+ schema = app.get_openapi_schema()
+
+ # THEN the schema should contain our custom configuration
+ assert schema.info.title == openapi_title
+ assert schema.info.version == openapi_myapi_version
+
+
+def test_prioritize_direct_parameters_over_stored_configuration():
+
+ # GIVEN
+ stored_config = {
+ "title": "Stored API Title",
+ "version": "1.0.0",
+ }
+
+ direct_params = {
+ "title": "Direct API Title",
+ "version": "2.0.0",
+ }
+
+ # GIVEN an API Gateway resolver with OpenAPI validation enabled
+ app = APIGatewayRestResolver(enable_validation=True)
+
+ app.configure_openapi(**stored_config)
+
+ # WHEN we have a simple handler
+ @app.get("/")
+ def handler():
+ pass
+
+ # WHEN we get the schema with direct params
+ schema = app.get_openapi_schema(**direct_params)
+
+ # THEN direct parameters must override stored configuration
+ assert schema.info.title == direct_params["title"]
+ assert schema.info.version == direct_params["version"]
+
+
+def test_export_openapi_schema_with_custom_configuration_and_json_export():
+ # GIVEN an API Gateway resolver with OpenAPI validation enabled
+ app = APIGatewayRestResolver(enable_validation=True)
+
+ # GIVEN custom OpenAPI configuration
+ openapi_title = "My API"
+ openapi_myapi_version = "1.1.1-alpha"
+ openapi_version = "3.1.2"
+ openapi_description = "My descrition"
+ app.configure_openapi(
+ title=openapi_title,
+ version=openapi_myapi_version,
+ openapi_version=openapi_version,
+ description=openapi_description,
+ )
+
+ # WHEN we have a simple handler
+ @app.get("/")
+ def handler():
+ pass
+
+ # WHEN we get the schema
+ schema = json.loads(app.get_openapi_json_schema())
+
+ # THEN the schema should contain our custom configuration
+ assert schema["info"]["title"] == openapi_title
+ assert schema["info"]["version"] == openapi_myapi_version
+ assert schema["openapi"] == openapi_version
+ assert schema["info"]["description"] == openapi_description
diff --git a/tests/functional/event_handler/_pydantic/test_openapi_params.py b/tests/functional/event_handler/_pydantic/test_openapi_params.py
index 2cf77a7de08..5bcda896858 100644
--- a/tests/functional/event_handler/_pydantic/test_openapi_params.py
+++ b/tests/functional/event_handler/_pydantic/test_openapi_params.py
@@ -32,7 +32,7 @@ def handler():
raise NotImplementedError()
schema = app.get_openapi_schema()
- assert schema.info.title == "Powertools API"
+ assert schema.info.title == "Powertools for AWS Lambda (Python) API"
assert schema.info.version == "1.0.0"
assert len(schema.paths.keys()) == 1
diff --git a/tests/functional/event_handler/_pydantic/test_openapi_validation_middleware.py b/tests/functional/event_handler/_pydantic/test_openapi_validation_middleware.py
index 54425f34986..4103a301020 100644
--- a/tests/functional/event_handler/_pydantic/test_openapi_validation_middleware.py
+++ b/tests/functional/event_handler/_pydantic/test_openapi_validation_middleware.py
@@ -17,6 +17,7 @@
VPCLatticeResolver,
VPCLatticeV2Resolver,
)
+from aws_lambda_powertools.event_handler.openapi.exceptions import ResponseValidationError
from aws_lambda_powertools.event_handler.openapi.params import Body, Header, Query
@@ -1128,3 +1129,252 @@ def handler(user_id: int = 123):
# THEN the handler should be invoked and return 200
result = app(minimal_event, {})
assert result["statusCode"] == 200
+
+
+@pytest.mark.skipif(reason="Test temporarily disabled until falsy return is fixed")
+def test_validation_error_none_returned_non_optional_type(gw_event):
+ # GIVEN an APIGatewayRestResolver with validation enabled
+ app = APIGatewayRestResolver(enable_validation=True)
+
+ class Model(BaseModel):
+ name: str
+ age: int
+
+ @app.get("/none_not_allowed")
+ def handler_none_not_allowed() -> Model:
+ return None # type: ignore
+
+ # WHEN returning None for a non-Optional type
+ gw_event["path"] = "/none_not_allowed"
+ result = app(gw_event, {})
+
+ # THEN it should return a validation error
+ assert result["statusCode"] == 422
+ body = json.loads(result["body"])
+ assert body["detail"][0]["type"] == "model_attributes_type"
+ assert body["detail"][0]["loc"] == ["response"]
+
+
+def test_validation_error_incomplete_model_returned_non_optional_type(gw_event):
+ # GIVEN an APIGatewayRestResolver with validation enabled
+ app = APIGatewayRestResolver(enable_validation=True)
+
+ class Model(BaseModel):
+ name: str
+ age: int
+
+ @app.get("/incomplete_model_not_allowed")
+ def handler_incomplete_model_not_allowed() -> Model:
+ return {"age": 18} # type: ignore
+
+ # WHEN returning incomplete model for a non-Optional type
+ gw_event["path"] = "/incomplete_model_not_allowed"
+ result = app(gw_event, {})
+
+ # THEN it should return a validation error
+ assert result["statusCode"] == 422
+ body = json.loads(result["body"])
+ assert "missing" in body["detail"][0]["type"]
+ assert "name" in body["detail"][0]["loc"]
+
+
+def test_none_returned_for_optional_type(gw_event):
+ # GIVEN an APIGatewayRestResolver with validation enabled
+ app = APIGatewayRestResolver(enable_validation=True)
+
+ class Model(BaseModel):
+ name: str
+ age: int
+
+ @app.get("/none_allowed")
+ def handler_none_allowed() -> Optional[Model]:
+ return None
+
+ # WHEN returning None for an Optional type
+ gw_event["path"] = "/none_allowed"
+ result = app(gw_event, {})
+
+ # THEN it should succeed
+ assert result["statusCode"] == 200
+ assert result["body"] == "null"
+
+
+@pytest.mark.skipif(reason="Test temporarily disabled until falsy return is fixed")
+@pytest.mark.parametrize(
+ "path, body",
+ [
+ ("/empty_dict", {}),
+ ("/empty_list", []),
+ ("/none", "null"),
+ ("/empty_string", ""),
+ ],
+ ids=["empty_dict", "empty_list", "none", "empty_string"],
+)
+def test_none_returned_for_falsy_return(gw_event, path, body):
+ # GIVEN an APIGatewayRestResolver with validation enabled
+ app = APIGatewayRestResolver(enable_validation=True)
+
+ class Model(BaseModel):
+ name: str
+ age: int
+
+ @app.get(path)
+ def handler_none_allowed() -> Model:
+ return body
+
+ # WHEN returning None for an Optional type
+ gw_event["path"] = path
+ result = app(gw_event, {})
+
+ # THEN it should succeed
+ assert result["statusCode"] == 422
+
+
+def test_custom_response_validation_error_http_code_valid_response(gw_event):
+ # GIVEN an APIGatewayRestResolver with custom response validation enabled
+ app = APIGatewayRestResolver(enable_validation=True, response_validation_error_http_code=422)
+
+ class Model(BaseModel):
+ name: str
+ age: int
+
+ @app.get("/valid_response")
+ def handler_valid_response() -> Model:
+ return {
+ "name": "Joe",
+ "age": 18,
+ } # type: ignore
+
+ # WHEN returning the expected type
+ gw_event["path"] = "/valid_response"
+ result = app(gw_event, {})
+
+ # THEN it should return a 200 OK
+ assert result["statusCode"] == 200
+ body = json.loads(result["body"])
+ assert body == {"name": "Joe", "age": 18}
+
+
+@pytest.mark.skipif(reason="Test temporarily disabled until falsy return is fixed")
+@pytest.mark.parametrize(
+ "http_code",
+ (422, 500, 510),
+)
+def test_custom_response_validation_error_http_code_invalid_response_none(
+ http_code,
+ gw_event,
+):
+ # GIVEN an APIGatewayRestResolver with custom response validation enabled
+ app = APIGatewayRestResolver(enable_validation=True, response_validation_error_http_code=http_code)
+
+ class Model(BaseModel):
+ name: str
+ age: int
+
+ @app.get("/none_not_allowed")
+ def handler_none_not_allowed() -> Model:
+ return None # type: ignore
+
+ # WHEN returning None for a non-Optional type
+ gw_event["path"] = "/none_not_allowed"
+ result = app(gw_event, {})
+
+ # THEN it should return a validation error with the custom status code provided
+ assert result["statusCode"] == http_code
+ body = json.loads(result["body"])
+ assert body["detail"][0]["type"] == "model_attributes_type"
+ assert body["detail"][0]["loc"] == ["response"]
+
+
+@pytest.mark.parametrize(
+ "http_code",
+ (422, 500, 510),
+)
+def test_custom_response_validation_error_http_code_invalid_response_incomplete_model(
+ http_code,
+ gw_event,
+):
+ # GIVEN an APIGatewayRestResolver with custom response validation enabled
+ app = APIGatewayRestResolver(enable_validation=True, response_validation_error_http_code=http_code)
+
+ class Model(BaseModel):
+ name: str
+ age: int
+
+ @app.get("/incomplete_model_not_allowed")
+ def handler_incomplete_model_not_allowed() -> Model:
+ return {"age": 18} # type: ignore
+
+ # WHEN returning incomplete model for a non-Optional type
+ gw_event["path"] = "/incomplete_model_not_allowed"
+ result = app(gw_event, {})
+
+ # THEN it should return a validation error with the custom status code provided
+ assert result["statusCode"] == http_code
+ body = json.loads(result["body"])
+ assert body["detail"][0]["type"] == "missing"
+ assert body["detail"][0]["loc"] == ["response", "name"]
+
+
+@pytest.mark.parametrize(
+ "http_code",
+ (422, 500, 510),
+)
+def test_custom_response_validation_error_sanitized_response(
+ http_code,
+ gw_event,
+):
+ # GIVEN an APIGatewayRestResolver with custom response validation enabled
+ # with a sanitized response validation error response
+ app = APIGatewayRestResolver(enable_validation=True, response_validation_error_http_code=http_code)
+
+ class Model(BaseModel):
+ name: str
+ age: int
+
+ @app.get("/incomplete_model_not_allowed")
+ def handler_incomplete_model_not_allowed() -> Model:
+ return {"age": 18} # type: ignore
+
+ @app.exception_handler(ResponseValidationError)
+ def handle_response_validation_error(ex: ResponseValidationError):
+ return Response(
+ status_code=500,
+ body="Unexpected response.",
+ )
+
+ # WHEN returning incomplete model for a non-Optional type
+ gw_event["path"] = "/incomplete_model_not_allowed"
+ result = app(gw_event, {})
+
+ # THEN it should return the sanitized response
+ assert result["statusCode"] == 500
+ assert result["body"] == "Unexpected response."
+
+
+def test_custom_response_validation_error_no_validation():
+ # GIVEN an APIGatewayRestResolver with validation not enabled
+ # setting a custom http status code for response validation must raise a ValueError
+ with pytest.raises(ValueError) as exception_info:
+ APIGatewayRestResolver(response_validation_error_http_code=500)
+
+ assert (
+ str(exception_info.value)
+ == "'response_validation_error_http_code' cannot be set when enable_validation is False."
+ )
+
+
+@pytest.mark.parametrize("response_validation_error_http_code", [(20), ("hi"), (1.21)])
+def test_custom_response_validation_error_bad_http_code(response_validation_error_http_code):
+ # GIVEN an APIGatewayRestResolver with validation enabled
+ # setting custom status code for response validation that is not a valid HTTP code must raise a ValueError
+ with pytest.raises(ValueError) as exception_info:
+ APIGatewayRestResolver(
+ enable_validation=True,
+ response_validation_error_http_code=response_validation_error_http_code,
+ )
+
+ assert (
+ str(exception_info.value)
+ == f"'{response_validation_error_http_code}' must be an integer representing an HTTP status code."
+ )
diff --git a/tests/functional/idempotency/_boto3/conftest.py b/tests/functional/idempotency/_boto3/conftest.py
index 044c091c12b..0b113c08753 100644
--- a/tests/functional/idempotency/_boto3/conftest.py
+++ b/tests/functional/idempotency/_boto3/conftest.py
@@ -29,18 +29,19 @@ def lambda_apigw_event():
return load_event("apiGatewayProxyV2Event.json")
-@pytest.fixture
-def lambda_context():
- class LambdaContext:
- def __init__(self):
- self.function_name = "test-func"
- self.memory_limit_in_mb = 128
- self.invoked_function_arn = "arn:aws:lambda:eu-west-1:809313241234:function:test-func"
- self.aws_request_id = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+class LambdaContext:
+ def __init__(self):
+ self.function_name = "test-func"
+ self.memory_limit_in_mb = 128
+ self.invoked_function_arn = "arn:aws:lambda:eu-west-1:809313241234:function:test-func"
+ self.aws_request_id = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+ def get_remaining_time_in_millis(self) -> int:
+ return 1000
- def get_remaining_time_in_millis(self) -> int:
- return 1000
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/tests/functional/idempotency/_boto3/test_idempotency.py b/tests/functional/idempotency/_boto3/test_idempotency.py
index f92fb639350..17f14c2c182 100644
--- a/tests/functional/idempotency/_boto3/test_idempotency.py
+++ b/tests/functional/idempotency/_boto3/test_idempotency.py
@@ -770,6 +770,54 @@ def lambda_handler(event, context):
stubber.deactivate()
+@pytest.mark.parametrize("idempotency_config", [{"use_local_cache": False}, {"use_local_cache": True}], indirect=True)
+def test_idempotent_lambda_expires_in_progress_before_expire_with_sort_key(
+ idempotency_config: IdempotencyConfig,
+ persistence_store_compound_static_pk_value: DynamoDBPersistenceLayer,
+ lambda_apigw_event,
+ timestamp_future,
+ lambda_response,
+ hashed_idempotency_key,
+ lambda_context,
+):
+ stubber = stub.Stubber(persistence_store_compound_static_pk_value.client)
+
+ stubber.add_client_error("put_item", "ConditionalCheckFailedException")
+
+ now = datetime.datetime.now()
+ period = datetime.timedelta(seconds=5)
+ timestamp_expires_in_progress = int((now + period).timestamp() * 1000)
+
+ expected_params_get_item = {
+ "TableName": TABLE_NAME,
+ "Key": {"id": {"S": "static-value"}, "sk": {"S": hashed_idempotency_key}},
+ "ConsistentRead": True,
+ }
+ ddb_response_get_item = {
+ "Item": {
+ "id": {"S": "static-value"},
+ "expiration": {"N": timestamp_future},
+ "in_progress_expiration": {"N": str(timestamp_expires_in_progress)},
+ "data": {"S": '{"message": "test", "statusCode": 200'},
+ "status": {"S": "INPROGRESS"},
+ "sk": {"S": hashed_idempotency_key},
+ },
+ }
+ stubber.add_response("get_item", ddb_response_get_item, expected_params_get_item)
+
+ stubber.activate()
+
+ @idempotent(config=idempotency_config, persistence_store=persistence_store_compound_static_pk_value)
+ def lambda_handler(event, context):
+ return lambda_response
+
+ with pytest.raises(IdempotencyAlreadyInProgressError, match="and sort key"):
+ lambda_handler(lambda_apigw_event, lambda_context)
+
+ stubber.assert_no_pending_responses()
+ stubber.deactivate()
+
+
@pytest.mark.parametrize("idempotency_config", [{"use_local_cache": False}, {"use_local_cache": True}], indirect=True)
def test_idempotent_lambda_expires_in_progress_after_expire(
idempotency_config: IdempotencyConfig,
diff --git a/tests/functional/idempotency/_redis/test_redis_layer.py b/tests/functional/idempotency/_redis/test_redis_layer.py
index b2cec340ed2..c2a0976b0ab 100644
--- a/tests/functional/idempotency/_redis/test_redis_layer.py
+++ b/tests/functional/idempotency/_redis/test_redis_layer.py
@@ -33,18 +33,19 @@
redis_badhost = "badhost"
-@pytest.fixture
-def lambda_context():
- class LambdaContext:
- def __init__(self):
- self.function_name = "test-func"
- self.memory_limit_in_mb = 128
- self.invoked_function_arn = "arn:aws:lambda:eu-west-1:809313241234:function:test-func"
- self.aws_request_id = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+class LambdaContext:
+ def __init__(self):
+ self.function_name = "test-func"
+ self.memory_limit_in_mb = 128
+ self.invoked_function_arn = "arn:aws:lambda:eu-west-1:809313241234:function:test-func"
+ self.aws_request_id = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+ def get_remaining_time_in_millis(self) -> int:
+ return 1000
- def get_remaining_time_in_millis(self) -> int:
- return 1000
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
diff --git a/tests/functional/logger/required_dependencies/test_logger.py b/tests/functional/logger/required_dependencies/test_logger.py
index 71dfbc27638..a508209b594 100644
--- a/tests/functional/logger/required_dependencies/test_logger.py
+++ b/tests/functional/logger/required_dependencies/test_logger.py
@@ -336,6 +336,33 @@ def handler(event, context):
assert second_log["cold_start"] is False
+def test_inject_lambda_cold_start_with_provisioned_concurrency(monkeypatch, lambda_context, stdout, service_name):
+
+ # GIVEN Provisioned Concurrency is enabled via AWS_LAMBDA_INITIALIZATION_TYPE environment variable
+ # AND Logger's cold start flag is explicitly set to True (simulating fresh module import)
+ monkeypatch.setenv("AWS_LAMBDA_INITIALIZATION_TYPE", "provisioned-concurrency")
+ from aws_lambda_powertools.logging import logger
+
+ logger.is_cold_start = True
+
+ # GIVEN Logger is initialized
+ logger = Logger(service=service_name, stream=stdout)
+
+ # WHEN a lambda function is decorated with logger, and called twice
+ @logger.inject_lambda_context
+ def handler(event, context):
+ logger.info("Hello")
+
+ handler({}, lambda_context)
+ handler({}, lambda_context)
+
+ # THEN cold_start should be False in both invocations
+ # because Provisioned Concurrency environment variable forces cold_start to always be False
+ first_log, second_log = capture_multiple_logging_statements_output(stdout)
+ assert first_log["cold_start"] is False
+ assert second_log["cold_start"] is False
+
+
def test_logger_append_duplicated(stdout, service_name):
# GIVEN Logger is initialized with request_id field
logger = Logger(service=service_name, stream=stdout, request_id="value")
diff --git a/tests/functional/logger/required_dependencies/test_powertools_logger_buffer.py b/tests/functional/logger/required_dependencies/test_powertools_logger_buffer.py
index 1e5a104be83..44e87d6102c 100644
--- a/tests/functional/logger/required_dependencies/test_powertools_logger_buffer.py
+++ b/tests/functional/logger/required_dependencies/test_powertools_logger_buffer.py
@@ -470,7 +470,12 @@ def test_buffer_configuration_propagation_across_child_logger_instances(stdout,
assert primary_logger._buffer_cache != secondary_logger._buffer_cache
-def test_logger_buffer_is_cleared_between_lambda_invocations(stdout, service_name, monkeypatch, lambda_context):
+def test_logger_buffer_is_cleared_between_lambda_invocations_with_decorator(
+ stdout,
+ service_name,
+ monkeypatch,
+ lambda_context,
+):
# Set initial trace ID for first Lambda invocation
monkeypatch.setenv(constants.XRAY_TRACE_ID_ENV, "1-67c39786-5908a82a246fb67f3089263f")
@@ -491,3 +496,30 @@ def handler(event, context):
# THEN Verify buffer for the original trace ID is cleared
assert not logger._buffer_cache.get("1-67c39786-5908a82a246fb67f3089263f")
+
+
+def test_logger_buffer_is_cleared_between_lambda_invocations_without_decoration(
+ stdout,
+ service_name,
+ monkeypatch,
+ lambda_context,
+):
+ # Set initial trace ID for first Lambda invocation
+ monkeypatch.setenv(constants.XRAY_TRACE_ID_ENV, "1-67c39786-5908a82a246fb67f3089263f")
+
+ # GIVEN A logger configured with specific buffer parameters
+ logger_buffer_config = LoggerBufferConfig(max_bytes=10240)
+ logger = Logger(level="DEBUG", service=service_name, stream=stdout, buffer_config=logger_buffer_config)
+
+ def handler(event, context):
+ logger.debug("debug line")
+
+ # WHEN First Lambda invocation with initial trace ID
+ handler({}, lambda_context)
+
+ # WHEN New Lambda invocation arrives with different trace ID
+ monkeypatch.setenv(constants.XRAY_TRACE_ID_ENV, "2-ABC39786-5908a82a246fb67f3089263f")
+ handler({}, lambda_context)
+
+ # THEN Verify buffer for the original trace ID is cleared
+ assert not logger._buffer_cache.get("1-67c39786-5908a82a246fb67f3089263f")
diff --git a/tests/functional/metrics/conftest.py b/tests/functional/metrics/conftest.py
index 2de3a0087c2..e9b4edb5935 100644
--- a/tests/functional/metrics/conftest.py
+++ b/tests/functional/metrics/conftest.py
@@ -7,7 +7,7 @@
Metrics,
MetricUnit,
)
-from aws_lambda_powertools.metrics.provider.cold_start import reset_cold_start_flag
+from aws_lambda_powertools.metrics.base import reset_cold_start_flag
@pytest.fixture(scope="function", autouse=True)
diff --git a/tests/functional/metrics/datadog/test_metrics_datadog.py b/tests/functional/metrics/datadog/test_metrics_datadog.py
index 631518287a0..2e677170244 100644
--- a/tests/functional/metrics/datadog/test_metrics_datadog.py
+++ b/tests/functional/metrics/datadog/test_metrics_datadog.py
@@ -31,6 +31,55 @@ def lambda_handler(event, context):
assert "example_fn2" in logs
+def test_datadog_coldstart_with_constructor_parameter(capsys):
+ reset_cold_start_flag()
+
+ # GIVEN DatadogMetrics is initialized
+ # AND DatadogMetrics is initialized with an explicit function_name parameter
+ dd_provider = DatadogProvider(flush_to_log=True, function_name="example_fn_constructor")
+ metrics = DatadogMetrics(provider=dd_provider)
+
+ LambdaContext = namedtuple("LambdaContext", "function_name")
+
+ # WHEN log_metrics is used with capture_cold_start_metric
+ @metrics.log_metrics(capture_cold_start_metric=True)
+ def lambda_handler(event, context):
+ metrics.add_metric(name="item_sold", value=1, product="latte", order="online")
+
+ lambda_handler({}, LambdaContext("example_fn2"))
+ logs = capsys.readouterr().out.strip()
+
+ # THEN ColdStart metric and function_name and service dimension should be logged
+ # THEN use the constructor-provided function_name (highest priority)
+ assert "ColdStart" in logs
+ assert "example_fn_constructor" in logs
+
+
+def test_datadog_coldstart_with_env_var(monkeypatch, capsys):
+ reset_cold_start_flag()
+
+ # GIVEN DatadogMetrics is initialized
+ # AND DatadogMetrics is initialized with an env var
+ monkeypatch.setenv("POWERTOOLS_METRICS_FUNCTION_NAME", "example_fn_env_var")
+ dd_provider = DatadogProvider(flush_to_log=True)
+ metrics = DatadogMetrics(provider=dd_provider)
+
+ LambdaContext = namedtuple("LambdaContext", "function_name")
+
+ # WHEN log_metrics is used with capture_cold_start_metric
+ @metrics.log_metrics(capture_cold_start_metric=True)
+ def lambda_handler(event, context):
+ metrics.add_metric(name="item_sold", value=1, product="latte", order="online")
+
+ lambda_handler({}, LambdaContext("example_fn2"))
+ logs = capsys.readouterr().out.strip()
+
+ # THEN ColdStart metric and function_name and service dimension should be logged
+ # THEN use the env var function_name (second priority)
+ assert "ColdStart" in logs
+ assert "example_fn_env_var" in logs
+
+
def test_datadog_write_to_log_with_env_variable(capsys, monkeypatch):
# GIVEN DD_FLUSH_TO_LOG env is configured
monkeypatch.setenv("DD_FLUSH_TO_LOG", "True")
@@ -46,6 +95,20 @@ def test_datadog_write_to_log_with_env_variable(capsys, monkeypatch):
assert logs == json.loads('{"m":"item_sold","v":1,"e":"","t":["product:latte","order:online"]}')
+def test_datadog_disable_write_to_log_with_env_variable(capsys, monkeypatch):
+ # GIVEN DD_FLUSH_TO_LOG env is configured
+ monkeypatch.setenv("DD_FLUSH_TO_LOG", "False")
+ metrics = DatadogMetrics()
+
+ # WHEN we add a metric
+ metrics.add_metric(name="item_sold", value=1, product="latte", order="online")
+ metrics.flush_metrics()
+ logs = capsys.readouterr().out.strip()
+
+ # THEN metrics is not flushed
+ assert not logs
+
+
def test_datadog_with_invalid_metric_value():
# GIVEN DatadogMetrics is initialized
metrics = DatadogMetrics()
@@ -405,7 +468,7 @@ def test_metrics_enabled_with_env_var_false(monkeypatch, capsys):
monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "false")
# WHEN metrics is initialized with namespace and metrics added
- metrics = DatadogMetrics(namespace="test")
+ metrics = DatadogMetrics(namespace="test", flush_to_log=True)
metrics.add_metric(name="test_metric", value=1)
metrics.flush_metrics()
@@ -421,7 +484,7 @@ def test_metrics_enabled_with_env_var_not_set(monkeypatch, capsys):
monkeypatch.delenv("POWERTOOLS_METRICS_DISABLED", raising=False)
# WHEN metrics is initialized with namespace and metrics added
- metrics = DatadogMetrics(namespace="test")
+ metrics = DatadogMetrics(namespace="test", flush_to_log=True)
metrics.add_metric(name="test_metric", value=1)
metrics.flush_metrics()
@@ -437,7 +500,7 @@ def test_metrics_enabled_with_dev_mode_false(monkeypatch, capsys):
monkeypatch.setenv("POWERTOOLS_DEV", "false")
# WHEN metrics is initialized
- metrics = DatadogMetrics(namespace="test")
+ metrics = DatadogMetrics(namespace="test", flush_to_log=True)
metrics.add_metric(name="test_metric", value=1)
metrics.flush_metrics()
@@ -453,7 +516,7 @@ def test_metrics_disabled_dev_mode_overrides_metrics_disabled(monkeypatch, capsy
monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "false")
# WHEN metrics is initialized
- metrics = DatadogMetrics(namespace="test")
+ metrics = DatadogMetrics(namespace="test", flush_to_log=True)
metrics.add_metric(name="test_metric", value=1)
metrics.flush_metrics()
@@ -471,7 +534,7 @@ def test_metrics_enabled_with_both_false(monkeypatch, capsys):
monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "false")
# WHEN metrics is initialized
- metrics = DatadogMetrics(namespace="test")
+ metrics = DatadogMetrics(namespace="test", flush_to_log=True)
metrics.add_metric(name="test_metric", value=1)
metrics.flush_metrics()
@@ -487,7 +550,7 @@ def test_metrics_disabled_with_dev_mode_false_and_metrics_disabled_true(monkeypa
monkeypatch.setenv("POWERTOOLS_METRICS_DISABLED", "true")
# WHEN metrics is initialized
- metrics = DatadogMetrics(namespace="test")
+ metrics = DatadogMetrics(namespace="test", flush_to_log=True)
metrics.add_metric(name="test_metric", value=1)
metrics.flush_metrics()
diff --git a/tests/functional/metrics/required_dependencies/test_metrics_cloudwatch_emf.py b/tests/functional/metrics/required_dependencies/test_metrics_cloudwatch_emf.py
index 29418c42bcf..50bee4950af 100644
--- a/tests/functional/metrics/required_dependencies/test_metrics_cloudwatch_emf.py
+++ b/tests/functional/metrics/required_dependencies/test_metrics_cloudwatch_emf.py
@@ -668,8 +668,9 @@ def test_namespace_var_precedence(monkeypatch, capsys, metric, dimension, namesp
assert namespace == output["_aws"]["CloudWatchMetrics"][0]["Namespace"]
-def test_log_metrics_capture_cold_start_metric(capsys, namespace, service):
- # GIVEN Metrics is initialized
+def test_log_metrics_capture_cold_start_metric_with_default_name(capsys, namespace, service):
+ # GIVEN Metrics is initialized without an explicit function_name parameter
+ # AND no POWERTOOLS_METRICS_FUNCTION_NAME environment variable is set
my_metrics = Metrics(service=service, namespace=namespace)
# WHEN log_metrics is used with capture_cold_start_metric
@@ -683,11 +684,58 @@ def lambda_handler(evt, context):
output = capture_metrics_output(capsys)
# THEN ColdStart metric and function_name and service dimension should be logged
+ # THEN use the Lambda context function_name as value (lowest priority fallback)
assert output["ColdStart"] == [1.0]
assert output["function_name"] == "example_fn"
assert output["service"] == service
+def test_log_metrics_capture_cold_start_metric_with_constructor_parameter(monkeypatch, capsys, namespace, service):
+ # GIVEN Metrics is initialized with an explicit function_name parameter
+ # and POWERTOOLS_METRICS_FUNCTION_NAME environment variable is set
+ monkeypatch.setenv("POWERTOOLS_METRICS_FUNCTION_NAME", "example_fn_env_var")
+ my_metrics = Metrics(service=service, namespace=namespace, function_name="example_fn_constructor")
+
+ # WHEN log_metrics is used with capture_cold_start_metric
+ @my_metrics.log_metrics(capture_cold_start_metric=True)
+ def lambda_handler(evt, context):
+ pass
+
+ LambdaContext = namedtuple("LambdaContext", "function_name")
+ lambda_handler({}, LambdaContext("example_fn"))
+
+ output = capture_metrics_output(capsys)
+
+ # THEN ColdStart metric and function_name and service dimension should be logged
+ # THEN use the constructor-provided function_name as value (highest priority)
+ assert output["ColdStart"] == [1.0]
+ assert output["function_name"] == "example_fn_constructor"
+ assert output["service"] == service
+
+
+def test_log_metrics_capture_cold_start_metric_with_env_var(monkeypatch, capsys, namespace, service):
+ # GIVEN POWERTOOLS_METRICS_FUNCTION_NAME environment variable is set
+ # AND Metrics is initialized without an explicit function_name parameter
+ monkeypatch.setenv("POWERTOOLS_METRICS_FUNCTION_NAME", "example_fn_env_var")
+ my_metrics = Metrics(service=service, namespace=namespace)
+
+ # WHEN log_metrics is used with capture_cold_start_metric
+ @my_metrics.log_metrics(capture_cold_start_metric=True)
+ def lambda_handler(evt, context):
+ pass
+
+ LambdaContext = namedtuple("LambdaContext", "function_name")
+ lambda_handler({}, LambdaContext("example_fn"))
+
+ output = capture_metrics_output(capsys)
+
+ # THEN ColdStart metric and function_name and service dimension should be logged
+ # THEN use the environment variable value as function_name value (second priority)
+ assert output["ColdStart"] == [1.0]
+ assert output["function_name"] == "example_fn_env_var"
+ assert output["service"] == service
+
+
def test_log_metrics_capture_cold_start_metric_no_service(capsys, namespace):
# GIVEN Metrics is initialized without service
my_metrics = Metrics(namespace=namespace)
diff --git a/tests/integration/idempotency/test_idempotency_redis.py b/tests/integration/idempotency/test_idempotency_redis.py
index bfced379dbf..6d30549e38b 100644
--- a/tests/integration/idempotency/test_idempotency_redis.py
+++ b/tests/integration/idempotency/test_idempotency_redis.py
@@ -25,24 +25,25 @@ def redis_container_image():
return "public.ecr.aws/docker/library/redis:7.2-alpine"
-@pytest.fixture
-def lambda_context():
- class LambdaContext:
- def __init__(self):
- self.function_name = "test-func"
- self.memory_limit_in_mb = 128
- self.invoked_function_arn = "arn:aws:lambda:eu-west-1:809313241234:function:test-func"
- self.aws_request_id = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+class LambdaContext:
+ def __init__(self):
+ self.function_name = "test-func"
+ self.memory_limit_in_mb = 128
+ self.invoked_function_arn = "arn:aws:lambda:eu-west-1:809313241234:function:test-func"
+ self.aws_request_id = "52fdfc07-2182-154f-163f-5f0f9a621d72"
+
+ def get_remaining_time_in_millis(self) -> int:
+ return 1000
- def get_remaining_time_in_millis(self) -> int:
- return 1000
+@pytest.fixture
+def lambda_context() -> LambdaContext:
return LambdaContext()
# test basic
def test_idempotent_function_and_lambda_handler_redis_basic(
- lambda_context,
+ lambda_context: LambdaContext,
redis_container_image,
):
with RedisContainer(image=redis_container_image) as redis_container:
@@ -69,7 +70,7 @@ def lambda_handler(event, context):
def test_idempotent_function_and_lambda_handler_redis_cache(
- lambda_context,
+ lambda_context: LambdaContext,
redis_container_image,
):
with RedisContainer(image=redis_container_image) as redis_container:
@@ -114,7 +115,7 @@ def lambda_handler(event, context):
# test idem-inprogress
def test_idempotent_lambda_redis_in_progress(
- lambda_context,
+ lambda_context: LambdaContext,
redis_container_image,
):
"""
@@ -146,7 +147,7 @@ def lambda_handler(event, context):
# test -remove
def test_idempotent_lambda_redis_delete(
- lambda_context,
+ lambda_context: LambdaContext,
redis_container_image,
):
with RedisContainer(image=redis_container_image) as redis_container:
@@ -175,7 +176,7 @@ def lambda_handler(event, context):
assert handler_result2 == result
-def test_idempotent_lambda_redis_credential(lambda_context, redis_container_image):
+def test_idempotent_lambda_redis_credential(lambda_context: LambdaContext, redis_container_image):
with RedisContainer(image=redis_container_image) as redis_container:
redis_client = redis_container.get_client()
diff --git a/tests/unit/data_classes/required_dependencies/test_api_gateway_websocket_event.py b/tests/unit/data_classes/required_dependencies/test_api_gateway_websocket_event.py
new file mode 100644
index 00000000000..faee5b17289
--- /dev/null
+++ b/tests/unit/data_classes/required_dependencies/test_api_gateway_websocket_event.py
@@ -0,0 +1,109 @@
+import json
+
+from aws_lambda_powertools.utilities.data_classes import APIGatewayWebSocketEvent
+from tests.functional.utils import load_event
+
+
+def test_connect_api_gateway_websocket_event():
+ raw_event = load_event("apiGatewayWebSocketApiConnect.json")
+ parsed_event = APIGatewayWebSocketEvent(raw_event)
+
+ assert parsed_event.is_base64_encoded is False
+ assert parsed_event.body is None
+ assert parsed_event.decoded_body is None
+ assert parsed_event.json_body is None
+ assert parsed_event.headers == raw_event["headers"]
+ assert parsed_event.multi_value_headers == raw_event["multiValueHeaders"]
+
+ request_context = parsed_event.request_context
+ request_context_raw = raw_event["requestContext"]
+ assert request_context.route_key == request_context_raw["routeKey"]
+ assert request_context.disconnect_status_code is None
+ assert request_context.message_id is None
+ assert request_context.event_type == request_context_raw["eventType"]
+ assert request_context.extended_request_id == request_context_raw["extendedRequestId"]
+ assert request_context.request_time == request_context_raw["requestTime"]
+ assert request_context.message_direction == request_context_raw["messageDirection"]
+ assert request_context.disconnect_reason is None
+ assert request_context.stage == request_context_raw["stage"]
+ assert request_context.connected_at == request_context_raw["connectedAt"]
+ assert request_context.request_time_epoch == request_context_raw["requestTimeEpoch"]
+ assert request_context.request_id == request_context_raw["requestId"]
+ assert request_context.domain_name == request_context_raw["domainName"]
+ assert request_context.connection_id == request_context_raw["connectionId"]
+ assert request_context.api_id == request_context_raw["apiId"]
+
+ identity = request_context.identity
+ identity_raw = request_context_raw["identity"]
+ assert identity.source_ip == identity_raw["sourceIp"]
+ assert identity.user_agent is None
+
+
+def test_disconnect_api_gateway_websocket_event():
+ raw_event = load_event("apiGatewayWebSocketApiDisconnect.json")
+ parsed_event = APIGatewayWebSocketEvent(raw_event)
+
+ assert parsed_event.is_base64_encoded is False
+ assert parsed_event.body is None
+ assert parsed_event.decoded_body is None
+ assert parsed_event.json_body is None
+ assert parsed_event.headers == raw_event["headers"]
+ assert parsed_event.multi_value_headers == raw_event["multiValueHeaders"]
+
+ request_context = parsed_event.request_context
+ request_context_raw = raw_event["requestContext"]
+ assert request_context.route_key == request_context_raw["routeKey"]
+ assert request_context.disconnect_status_code == request_context_raw["disconnectStatusCode"]
+ assert request_context.message_id is None
+ assert request_context.event_type == request_context_raw["eventType"]
+ assert request_context.extended_request_id == request_context_raw["extendedRequestId"]
+ assert request_context.request_time == request_context_raw["requestTime"]
+ assert request_context.message_direction == request_context_raw["messageDirection"]
+ assert request_context.disconnect_reason == request_context_raw["disconnectReason"]
+ assert request_context.stage == request_context_raw["stage"]
+ assert request_context.connected_at == request_context_raw["connectedAt"]
+ assert request_context.request_time_epoch == request_context_raw["requestTimeEpoch"]
+ assert request_context.request_id == request_context_raw["requestId"]
+ assert request_context.domain_name == request_context_raw["domainName"]
+ assert request_context.connection_id == request_context_raw["connectionId"]
+ assert request_context.api_id == request_context_raw["apiId"]
+
+ identity = request_context.identity
+ identity_raw = request_context_raw["identity"]
+ assert identity.source_ip == identity_raw["sourceIp"]
+ assert identity.user_agent is None
+
+
+def test_message_api_gateway_websocket_event():
+ raw_event = load_event("apiGatewayWebSocketApiMessage.json")
+ parsed_event = APIGatewayWebSocketEvent(raw_event)
+
+ assert parsed_event.is_base64_encoded is False
+ assert parsed_event.body == raw_event["body"]
+ assert parsed_event.decoded_body == raw_event["body"]
+ assert parsed_event.json_body == json.loads(raw_event["body"])
+ assert parsed_event.headers == {}
+ assert parsed_event.multi_value_headers == {}
+
+ request_context = parsed_event.request_context
+ request_context_raw = raw_event["requestContext"]
+ assert request_context.route_key == request_context_raw["routeKey"]
+ assert request_context.disconnect_status_code is None
+ assert request_context.message_id == request_context_raw["messageId"]
+ assert request_context.event_type == request_context_raw["eventType"]
+ assert request_context.extended_request_id == request_context_raw["extendedRequestId"]
+ assert request_context.request_time == request_context_raw["requestTime"]
+ assert request_context.message_direction == request_context_raw["messageDirection"]
+ assert request_context.disconnect_reason is None
+ assert request_context.stage == request_context_raw["stage"]
+ assert request_context.connected_at == request_context_raw["connectedAt"]
+ assert request_context.request_time_epoch == request_context_raw["requestTimeEpoch"]
+ assert request_context.request_id == request_context_raw["requestId"]
+ assert request_context.domain_name == request_context_raw["domainName"]
+ assert request_context.connection_id == request_context_raw["connectionId"]
+ assert request_context.api_id == request_context_raw["apiId"]
+
+ identity = request_context.identity
+ identity_raw = request_context_raw["identity"]
+ assert identity.source_ip == identity_raw["sourceIp"]
+ assert identity.user_agent is None
diff --git a/tests/unit/data_classes/required_dependencies/test_cognito_user_pool_event.py b/tests/unit/data_classes/required_dependencies/test_cognito_user_pool_event.py
index ee019605725..99984a3d87d 100644
--- a/tests/unit/data_classes/required_dependencies/test_cognito_user_pool_event.py
+++ b/tests/unit/data_classes/required_dependencies/test_cognito_user_pool_event.py
@@ -103,11 +103,11 @@ def test_cognito_custom_message_trigger_event():
assert parsed_event.request.client_metadata == {}
parsed_event.response.sms_message = "sms"
- assert parsed_event.response.sms_message == parsed_event["response"]["smsMessage"]
+ assert parsed_event.response.sms_message == raw_event["response"]["smsMessage"]
parsed_event.response.email_message = "email"
- assert parsed_event.response.email_message == parsed_event["response"]["emailMessage"]
+ assert parsed_event.response.email_message == raw_event["response"]["emailMessage"]
parsed_event.response.email_subject = "subject"
- assert parsed_event.response.email_subject == parsed_event["response"]["emailSubject"]
+ assert parsed_event.response.email_subject == raw_event["response"]["emailSubject"]
def test_cognito_custom_email_sender_trigger_event():
@@ -141,7 +141,7 @@ def test_cognito_pre_authentication_trigger_event():
assert parsed_event.trigger_source == raw_event["triggerSource"]
assert parsed_event.request.user_not_found is None
- parsed_event["request"]["userNotFound"] = True
+ raw_event["request"]["userNotFound"] = True
assert parsed_event.request.user_not_found is True
assert parsed_event.request.user_attributes.get("email") == raw_event["request"]["userAttributes"]["email"]
assert parsed_event.request.validation_data == {}
@@ -171,57 +171,42 @@ def test_cognito_pre_token_generation_trigger_event():
assert parsed_event.request.user_attributes.get("email") == raw_event["request"]["userAttributes"]["email"]
assert parsed_event.request.client_metadata == {}
- parsed_event["request"]["groupConfiguration"]["preferredRole"] = "temp"
+ raw_event["request"]["groupConfiguration"]["preferredRole"] = "temp"
group_configuration = parsed_event.request.group_configuration
assert group_configuration.preferred_role == "temp"
- assert parsed_event["response"].get("claimsOverrideDetails") is None
claims_override_details = parsed_event.response.claims_override_details
- assert parsed_event["response"]["claimsOverrideDetails"] == {}
-
assert claims_override_details.claims_to_add_or_override == {}
assert claims_override_details.claims_to_suppress == []
assert claims_override_details.group_configuration is None
claims_override_details.group_configuration = {}
assert claims_override_details.group_configuration._data == {}
- assert parsed_event["response"]["claimsOverrideDetails"]["groupOverrideDetails"] == {}
expected_claims = {"test": "value"}
claims_override_details.claims_to_add_or_override = expected_claims
assert claims_override_details.claims_to_add_or_override["test"] == "value"
- assert parsed_event["response"]["claimsOverrideDetails"]["claimsToAddOrOverride"] == expected_claims
claims_override_details.claims_to_suppress = ["email"]
assert claims_override_details.claims_to_suppress[0] == "email"
- assert parsed_event["response"]["claimsOverrideDetails"]["claimsToSuppress"] == ["email"]
expected_groups = ["group-A", "group-B"]
claims_override_details.set_group_configuration_groups_to_override(expected_groups)
assert claims_override_details.group_configuration.groups_to_override == expected_groups
- assert (
- parsed_event["response"]["claimsOverrideDetails"]["groupOverrideDetails"]["groupsToOverride"] == expected_groups
- )
- claims_override_details = parsed_event.response.claims_override_details
- assert claims_override_details["groupOverrideDetails"]["groupsToOverride"] == expected_groups
claims_override_details.set_group_configuration_iam_roles_to_override(["role"])
assert claims_override_details.group_configuration.iam_roles_to_override == ["role"]
- assert parsed_event["response"]["claimsOverrideDetails"]["groupOverrideDetails"]["iamRolesToOverride"] == ["role"]
claims_override_details.set_group_configuration_preferred_role("role_name")
assert claims_override_details.group_configuration.preferred_role == "role_name"
- assert parsed_event["response"]["claimsOverrideDetails"]["groupOverrideDetails"]["preferredRole"] == "role_name"
# Ensure that even if "claimsOverrideDetails" was explicitly set to None
# accessing `event.response.claims_override_details` would set it to `{}`
- parsed_event["response"]["claimsOverrideDetails"] = None
+ raw_event["response"]["claimsOverrideDetails"] = None
claims_override_details = parsed_event.response.claims_override_details
assert claims_override_details._data == {}
- assert parsed_event["response"]["claimsOverrideDetails"] == {}
claims_override_details.claims_to_suppress = ["email"]
assert claims_override_details.claims_to_suppress[0] == "email"
- assert parsed_event["response"]["claimsOverrideDetails"]["claimsToSuppress"] == ["email"]
def test_cognito_pre_token_v2_generation_trigger_event():
@@ -236,15 +221,12 @@ def test_cognito_pre_token_v2_generation_trigger_event():
assert parsed_event.request.user_attributes.get("email") == raw_event["request"]["userAttributes"]["email"]
assert parsed_event.request.client_metadata == {}
- parsed_event["request"]["groupConfiguration"]["preferredRole"] = "temp"
+ raw_event["request"]["groupConfiguration"]["preferredRole"] = "temp"
group_configuration = parsed_event.request.group_configuration
assert group_configuration.preferred_role == "temp"
assert parsed_event.request.scopes == raw_event["request"]["scopes"]
- assert parsed_event["response"].get("claimsAndScopeOverrideDetails") is None
claims_scope_override_details = parsed_event.response.claims_scope_override_details
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"] == {}
-
claims_scope_override_details.id_token_generation = claims_scope_override_details.access_token_generation = {}
assert claims_scope_override_details.id_token_generation.claims_to_add_or_override == {}
assert claims_scope_override_details.id_token_generation.claims_to_suppress == []
@@ -258,45 +240,24 @@ def test_cognito_pre_token_v2_generation_trigger_event():
claims_scope_override_details.group_configuration = {}
assert claims_scope_override_details.group_configuration._data == {}
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["groupOverrideDetails"] == {}
expected_claims = {"test": "value"}
claims_scope_override_details.id_token_generation.claims_to_add_or_override = expected_claims
claims_scope_override_details.access_token_generation.claims_to_add_or_override = expected_claims
assert claims_scope_override_details.id_token_generation.claims_to_add_or_override["test"] == "value"
assert claims_scope_override_details.access_token_generation.claims_to_add_or_override["test"] == "value"
- assert (
- parsed_event["response"]["claimsAndScopeOverrideDetails"]["idTokenGeneration"]["claimsToAddOrOverride"]
- == expected_claims
- )
- assert (
- parsed_event["response"]["claimsAndScopeOverrideDetails"]["accessTokenGeneration"]["claimsToAddOrOverride"]
- == expected_claims
- )
claims_scope_override_details.id_token_generation.claims_to_suppress = (
claims_scope_override_details.access_token_generation.claims_to_suppress
) = ["email"]
assert claims_scope_override_details.id_token_generation.claims_to_suppress[0] == "email"
assert claims_scope_override_details.access_token_generation.claims_to_suppress[0] == "email"
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["idTokenGeneration"]["claimsToSuppress"] == [
- "email",
- ]
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["accessTokenGeneration"]["claimsToSuppress"] == [
- "email",
- ]
claims_scope_override_details.id_token_generation.scopes_to_suppress = (
claims_scope_override_details.access_token_generation.scopes_to_suppress
) = ["email"]
assert claims_scope_override_details.id_token_generation.scopes_to_suppress[0] == "email"
assert claims_scope_override_details.access_token_generation.scopes_to_suppress[0] == "email"
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["idTokenGeneration"]["scopesToSuppress"] == [
- "email",
- ]
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["accessTokenGeneration"]["scopesToSuppress"] == [
- "email",
- ]
claims_scope_override_details.id_token_generation.scopes_to_add = (
claims_scope_override_details.access_token_generation.scopes_to_add
@@ -305,47 +266,27 @@ def test_cognito_pre_token_v2_generation_trigger_event():
claims_scope_override_details.id_token_generation.scopes_to_add[0] == "email"
and claims_scope_override_details.access_token_generation.scopes_to_add[0] == "email"
)
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["idTokenGeneration"]["scopesToAdd"] == ["email"]
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["accessTokenGeneration"]["scopesToAdd"] == [
- "email",
- ]
expected_groups = ["group-A", "group-B"]
claims_scope_override_details.set_group_configuration_groups_to_override(expected_groups)
assert claims_scope_override_details.group_configuration.groups_to_override == expected_groups
- assert (
- parsed_event["response"]["claimsAndScopeOverrideDetails"]["groupOverrideDetails"]["groupsToOverride"]
- == expected_groups
- )
claims_scope_override_details = parsed_event.response.claims_scope_override_details
- assert claims_scope_override_details["groupOverrideDetails"]["groupsToOverride"] == expected_groups
claims_scope_override_details.set_group_configuration_iam_roles_to_override(["role"])
assert claims_scope_override_details.group_configuration.iam_roles_to_override == ["role"]
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["groupOverrideDetails"]["iamRolesToOverride"] == [
- "role",
- ]
claims_scope_override_details.set_group_configuration_preferred_role("role_name")
assert claims_scope_override_details.group_configuration.preferred_role == "role_name"
- assert (
- parsed_event["response"]["claimsAndScopeOverrideDetails"]["groupOverrideDetails"]["preferredRole"]
- == "role_name"
- )
# Ensure that even if "claimsAndScopeOverrideDetails" was explicitly set to None
# accessing `event.response.claims_scope_override_details` would set it to `{}`
- parsed_event["response"]["claimsAndScopeOverrideDetails"] = None
+ raw_event["response"]["claimsAndScopeOverrideDetails"] = None
claims_scope_override_details = parsed_event.response.claims_scope_override_details
assert claims_scope_override_details._data == {}
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"] == {}
claims_scope_override_details.id_token_generation = {}
claims_scope_override_details.id_token_generation.claims_to_suppress = ["email"]
assert claims_scope_override_details.id_token_generation.claims_to_suppress[0] == "email"
- assert parsed_event["response"]["claimsAndScopeOverrideDetails"]["idTokenGeneration"]["claimsToSuppress"] == [
- "email",
- ]
def test_cognito_define_auth_challenge_trigger_event():
@@ -367,14 +308,14 @@ def test_cognito_define_auth_challenge_trigger_event():
# Verify setters
parsed_event.response.challenge_name = "CUSTOM_CHALLENGE"
- assert parsed_event.response.challenge_name == parsed_event["response"]["challengeName"]
+ assert parsed_event.response.challenge_name == raw_event["response"]["challengeName"]
assert parsed_event.response.challenge_name == "CUSTOM_CHALLENGE"
parsed_event.response.fail_authentication = True
assert parsed_event.response.fail_authentication
- assert parsed_event.response.fail_authentication == parsed_event["response"]["failAuthentication"]
+ assert parsed_event.response.fail_authentication == raw_event["response"]["failAuthentication"]
parsed_event.response.issue_tokens = True
assert parsed_event.response.issue_tokens
- assert parsed_event.response.issue_tokens == parsed_event["response"]["issueTokens"]
+ assert parsed_event.response.issue_tokens == raw_event["response"]["issueTokens"]
def test_create_auth_challenge_trigger_event():
@@ -395,13 +336,13 @@ def test_create_auth_challenge_trigger_event():
# Verify setters
parsed_event.response.public_challenge_parameters = {"test": "value"}
- assert parsed_event.response.public_challenge_parameters == parsed_event["response"]["publicChallengeParameters"]
+ assert parsed_event.response.public_challenge_parameters == raw_event["response"]["publicChallengeParameters"]
assert parsed_event.response.public_challenge_parameters["test"] == "value"
parsed_event.response.private_challenge_parameters = {"private": "value"}
- assert parsed_event.response.private_challenge_parameters == parsed_event["response"]["privateChallengeParameters"]
+ assert parsed_event.response.private_challenge_parameters == raw_event["response"]["privateChallengeParameters"]
assert parsed_event.response.private_challenge_parameters["private"] == "value"
parsed_event.response.challenge_metadata = "meta"
- assert parsed_event.response.challenge_metadata == parsed_event["response"]["challengeMetadata"]
+ assert parsed_event.response.challenge_metadata == raw_event["response"]["challengeMetadata"]
assert parsed_event.response.challenge_metadata == "meta"
@@ -423,5 +364,5 @@ def test_verify_auth_challenge_response_trigger_event():
# Verify setters
parsed_event.response.answer_correct = True
- assert parsed_event.response.answer_correct == parsed_event["response"]["answerCorrect"]
+ assert parsed_event.response.answer_correct == raw_event["response"]["answerCorrect"]
assert parsed_event.response.answer_correct
diff --git a/tests/unit/data_classes/required_dependencies/test_kinesis_stream_event.py b/tests/unit/data_classes/required_dependencies/test_kinesis_stream_event.py
index f136cdbc0be..e97f15a8277 100644
--- a/tests/unit/data_classes/required_dependencies/test_kinesis_stream_event.py
+++ b/tests/unit/data_classes/required_dependencies/test_kinesis_stream_event.py
@@ -29,7 +29,6 @@ def test_kinesis_stream_event():
kinesis = record.kinesis
kinesis_raw = raw_event["Records"][0]["kinesis"]
- assert kinesis._data["kinesis"] == kinesis_raw
assert kinesis.approximate_arrival_timestamp == kinesis_raw["approximateArrivalTimestamp"]
assert kinesis.data == kinesis_raw["data"]
diff --git a/tests/unit/test_tracing.py b/tests/unit/test_tracing.py
index 98af062494e..425230380ea 100644
--- a/tests/unit/test_tracing.py
+++ b/tests/unit/test_tracing.py
@@ -630,6 +630,40 @@ def handler(event, context):
assert in_subsegment_mock.put_annotation.call_args_list[2] == mocker.call(key="ColdStart", value=False)
+def test_tracer_lambda_handler_cold_start_with_provisioned_concurrency(
+ monkeypatch,
+ mocker,
+ dummy_response,
+ provider_stub,
+ in_subsegment_mock,
+):
+ # GIVEN Provisioned Concurrency is enabled via AWS_LAMBDA_INITIALIZATION_TYPE environment variable
+ monkeypatch.setenv("AWS_LAMBDA_INITIALIZATION_TYPE", "provisioned-concurrency")
+ # GIVEN
+ provider = provider_stub(in_subsegment=in_subsegment_mock.in_subsegment)
+ tracer = Tracer(provider=provider, service="booking")
+
+ # WHEN a Lambda handler is decorated with capture_lambda_handler
+ # AND the handler is invoked twice consecutively
+ @tracer.capture_lambda_handler
+ def handler(event, context):
+ return dummy_response
+
+ # First invocation
+ handler({}, mocker.MagicMock())
+
+ # THEN the ColdStart annotation should be set to False for the first invocation
+ # because Provisioned Concurrency forces cold start to be false regardless of actual state
+ assert in_subsegment_mock.put_annotation.call_args_list[0] == mocker.call(key="ColdStart", value=False)
+
+ # WHEN the same handler is invoked a second time
+ handler({}, mocker.MagicMock())
+
+ # THEN the ColdStart annotation should also be False for the second invocation
+ # confirming that Provisioned Concurrency consistently overrides cold start detection
+ assert in_subsegment_mock.put_annotation.call_args_list[2] == mocker.call(key="ColdStart", value=False)
+
+
def test_tracer_lambda_handler_add_service_annotation(mocker, dummy_response, provider_stub, in_subsegment_mock):
# GIVEN
provider = provider_stub(in_subsegment=in_subsegment_mock.in_subsegment)